什么块没有被覆盖?
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
条件的肯定结果,另一个验证否定结果。什么块没有被覆盖?我缺少什么逻辑条件?
浅米色并不意味着代码没有被覆盖。这意味着它只被部分覆盖。您的 ServiceWindowStart
和 ServiceWindowEnd
可以为空。但是你只能用值来测试它们。而且你不测试平等。为空值和它们相等的情况添加测试应该覆盖缺失的测试用例。
导致此结果的另一个可能原因可能与以下事实有关:代码覆盖是在 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)
应该可以解决这个问题。
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
条件的肯定结果,另一个验证否定结果。什么块没有被覆盖?我缺少什么逻辑条件?
浅米色并不意味着代码没有被覆盖。这意味着它只被部分覆盖。您的 ServiceWindowStart
和 ServiceWindowEnd
可以为空。但是你只能用值来测试它们。而且你不测试平等。为空值和它们相等的情况添加测试应该覆盖缺失的测试用例。
导致此结果的另一个可能原因可能与以下事实有关:代码覆盖是在 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)
应该可以解决这个问题。