分支覆盖率没有分支-我知道听起来很奇怪

sd2nnvve  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(366)

我有一堆验证代码遵循以下模式:

bool IsBroken()
{
    var isBroken = Check(..., "error-1")
        | Check(..., "error-2")
        ...
        | Check(..., "error-n");

    if (...)
    {
        isBroken |= Check(..., "error-1")
            | Check(..., "error-2")
            ...
            | Check(..., "error-n");
    }
    else
    {
        isBroken |= Check(..., "error-1")
            | Check(..., "error-2")
            ...
            | Check(..., "error-n");
    }

    // ...
    // Could have more if-else or even nested if-else

    return isBroken;
}

bool Check(bool condition, string message)
{
    if (condition)
    {
        errors.Add(message);
    }
    return condition;
}

目标是执行所有检查,而不管结果如何。然而,这段代码的问题是它不支持分支覆盖。
一个简单的解决办法就是回复 Check(bool, string) 很明显,这会产生另一个较小的问题,即代码混乱。我正试图找出一个解决方案,可以给我最好的两个世界。有什么主意吗?!

u4dcyp6a

u4dcyp6a1#

如果重复验证(if检查)太多且时间很短,则可以创建需要执行的检查字典。将此字典传递给方法,迭代字典中的项,并在发生验证错误时添加错误消息。
示例代码:

class A
{
    Dictionary<Func<A, bool>, string> dictOfChecks = new Dictionary<Func<A, bool>, string>()
    {
        //Example of checks                 , Error Message
        { (arg) => arg.ToString().Length < 3, "Length is smaller than 3" },
        { (arg) => arg.ToString().Length < 2, "Length is smaller than 2" },
    };

    public bool IsBroken()
    {
        //there you can enter multiple call of GetErrors to check whether there are some
        var errors = GetErrors(dictOfChecks);

        return errors.Length == 0;
    }

    public string[] GetErrors(Dictionary<Func<A, bool>, string> dict)
    {
        var errors = new List<string>();

        foreach (KeyValuePair<Func<A, bool>, string> kvp in dict)
        {
            if (kvp.Key.Invoke(this))
                errors.Add(kvp.Value);
        }

        return errors.ToArray();
    }
}
pexxcrt2

pexxcrt22#

想出了一个好的解决方案:

_ = condition && Append("error");

bool Append(string error)
{
    errors.Add(error);
    return true;
}

而这也可以写成 if (condition) Append("error") . 在我们的例子中,块语句必须写成:

if (condition)
{
    ...
}

相关问题