【发布时间】:2018-03-23 17:51:27
【问题描述】:
当使用 dotCover 运行我们的一个单元测试时,我发现它出现了一些奇怪的行为。
本质上,单元测试调用一个方法并将double.NaN 作为参数传递给。该方法比较提供的参数是否超出允许的范围。如果超出范围,则抛出异常。
这段代码说明了代码:
[TestCase(double.NaN)]
public void Test(double testValue)
{
if (testValue < 0.0 || testValue > 30.0)
{
Assert.Fail($"This shouldn't fail less={testValue < 0.0}, greater={testValue > 30.0}, all={ (testValue < 0.0 || testValue > 30.0)}");
}
Assert.Pass("all good!");
}
由于double.NaN 不等于任何东西,因此永远不应调用Assert.Fail。
一般情况下都是这样,只有一个例外。
当代码在 Optimize Code 开启的情况下编译(例如发布配置)并且 dotCover 用于分析代码覆盖率。
在这种情况下,将输入 if 语句。输出如下所示:
这不应该失败 less=False、greater=False、all=False
我找到了一些方法来更改代码以使其在不实际更改逻辑本身的情况下工作。
-
将比较分配给局部变量
bool isNotValid = testValue < 0.0 || testValue > 30.0; if(isNotValid) -
单独的 if 语句
if(testValue < 0.0) { Assert.Fail(...); } else if(testValue > 30.0) { Assert.Fail(...); } -
单个
|运算符if (testValue < 0.0 | testValue > 30.0) { Assert.Fail(...); } -
明确检查
double.NaNif (!double.IsNaN(testValue) && (testValue < 0.0 || testValue > 30.0)) { Assert.Fail(...); }
有人对这种行为有解释吗? 我想避免仅仅为了让 dotCover 开心而将代码添加到我们的代码库中。
我正在使用:
- VS 2017
- dotCover 2017.3.2
- NUnit 3.10.1.0
【问题讨论】:
标签: c# visual-studio-2017 nunit dotcover