什么街区没有覆盖?

时间:2015-01-06 13:51:42

标签: c# unit-testing visual-studio-2013 code-coverage

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

code coverage

据我所知,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条件的正面结果,另一个验证否定结果。什么街区没有包括在内?我缺少什么逻辑条件?

2 个答案:

答案 0 :(得分:3)

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

将条件更改为

if (ServiceWindowStart.Value > ServiceWindowEnd.Value)

应该解决这个问题。

答案 1 :(得分:2)

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

此结果的另一个可能原因可能与代码覆盖是针对IL代码而不是针对C#代码执行有关。并且可能无法完全覆盖IL等价物,或者可能无法保留代码的结构。

优化构建可以解决问题。转到解决方案资源管理器 - &gt;属性 - &gt;构建标签 - &gt;检查&#34;优化代码&#34;复选框。

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

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