什么块没有被覆盖?

What Block Isn't Covered?

Visual Studio 2013 显示我对此(针对此示例进行了简化)对象的代码覆盖率缺少一个块:

据我所知,if应该恰好有两种状态。通过和失败。调试我的测试表明每个条件都执行一次。特别是这两个测试:

[TestMethod]
public void CanNotHaveNegativeServiceWindow()
{
    // arrange
    var request = new CreateCaseRequest
    {
        ServiceWindowStart = new DateTime(2014, 12, 31, 12, 00, 00),
        ServiceWindowEnd = new DateTime(2014, 12, 31, 11, 00, 00)
    };

    // act
    var result = request.GetValidationErrors();

    // assert
    Assert.AreEqual(1, result.Count());
}

[TestMethod]
public void CanHaveServiceWindow()
{
    // arrange
    var request = new CreateCaseRequest
    {
        ServiceWindowStart = new DateTime(2014, 12, 31, 11, 00, 00),
        ServiceWindowEnd = new DateTime(2014, 12, 31, 12, 00, 00)
    };

    // act
    var result = request.GetValidationErrors();

    // assert
    Assert.AreEqual(0, result.Count());
}

一个测试验证该特定 if 条件的肯定结果,另一个验证否定结果。什么块没有被覆盖?我缺少什么逻辑条件?

浅米色并不意味着代码没有被覆盖。这意味着它只被部分覆盖。您的 ServiceWindowStartServiceWindowEnd 可以为空。但是你只能用值来测试它们。而且你不测试平等。为空值和它们相等的情况添加测试应该覆盖缺失的测试用例。

导致此结果的另一个可能原因可能与以下事实有关:代码覆盖是在 IL 代码上执行的,而不是在 C# 代码上执行的。并且 IL 等价物可能没有被完全覆盖或者代码的结构可能没有被保留。

优化您的构建可能会解决问题。转到解决方案资源管理器 -> 属性 -> 生成选项卡 ​​-> 选中 "Optimize code" 复选框。

运行 选择此选项的代码分析。

这是涵盖此主题的有趣博客 post:http://blogs.msdn.com/b/ddietric/archive/2009/10/21/all-the-wonderful-colors-of-code-coverage.aspx

当您比较 Nullable<T> 值时,C# 编译器会创建额外的检查以查看 Nullable<T> 是否具有值。这些检查在您的代码中总是以相同的方式出现,因为您已经明确地完成了所有 null 检查。

将条件更改为

if (ServiceWindowStart.Value > ServiceWindowEnd.Value)

应该可以解决这个问题。