【问题标题】:changed logic when using dotCover and optimizied code使用 dotCover 和优化代码时更改了逻辑
【发布时间】: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

我找到了一些方法来更改代码以使其在不实际更改逻辑本身的情况下工作。

  1. 将比较分配给局部变量

    bool isNotValid = testValue < 0.0 || testValue > 30.0;
    if(isNotValid)
    
  2. 单独的 if 语句

    if(testValue < 0.0)
    {
        Assert.Fail(...);
    }
    else if(testValue > 30.0)
    {
        Assert.Fail(...);
    }
    
  3. 单个| 运算符

    if (testValue < 0.0 | testValue > 30.0)
    {
        Assert.Fail(...);
    }
    
  4. 明确检查double.NaN

    if (!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


    【解决方案1】:

    我们在 dotCover 中发现了一个导致此行为的错误。该修复程序将在 ReSharper 2018.2 版本中提供。我们预计会在几个月内发布它。很抱歉给您带来不便。

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多