Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单元测试中抛出异常时,如何获得100%的覆盖率?_C#_Unit Testing - Fatal编程技术网

C# 在单元测试中抛出异常时,如何获得100%的覆盖率?

C# 在单元测试中抛出异常时,如何获得100%的覆盖率?,c#,unit-testing,C#,Unit Testing,在C#中,您可以在默认测试套件中捕获异常,如下所示: [TestMethod] [ExpectedException(typeof (ArgumentNullException))] public void TestNullComposite() { IApi api = new Api(); api.GetDataUsingDataContract(null); // this method throws ArgumentNullException } 但是当你分析代码覆盖率

C#
中,您可以在默认测试套件中捕获异常,如下所示:

[TestMethod]
[ExpectedException(typeof (ArgumentNullException))]
public void TestNullComposite()
{
    IApi api = new Api();
    api.GetDataUsingDataContract(null); // this method throws ArgumentNullException
}
但是当你分析代码覆盖率时,它说你只得到66.67%的覆盖率,因为最后一个大括号没有覆盖


我如何才能在这个单元测试中实现100%的覆盖率?

通常,当人们测量代码覆盖率时,他们关注的是测试所覆盖的代码,而不是测试本身

如本例所示,要求对测试单元进行100%覆盖是没有意义的

这项测试应该是失败的。这就是你正在测试的

如果您真的希望执行整个方法,我想您可以测试异常是否是手动引发的。类似这样的东西(还没有测试过,但我不明白为什么它不应该工作):


但这似乎是毫无理由的额外工作。我建议您重新评估您的测试实践

小牛说的是真的。此外,还有一种方法可以将测试类从代码覆盖范围中排除

只需使用该属性装饰您的[TestClass]

通过这种方式,至少在理论上可以达到100%CC。

您有一个方法,该方法检查是否引发了所需的异常。它还将该异常作为返回值返回,这样,如果愿意,您可以进行进一步的资产评估:

[Test]
public void Api_GetDataUsingDataContractWithNullParameter_ThrowsArgumentNullException()
{
    var api = new Api();
    var exception = Assert.Throws<ArgumentNullException>(() => api.GetDataUsingDataContract(null));
    Assert.That(exception.Message, Is.Not.Null.Or.Empty);
    Assert.That(exception.Message, Is.StringContaining("source"));
}
[测试]
public void Api_GetDataUsingDataContractWithNullParameter_ThrowsArgumentNullException()
{
var api=新的api();
var exception=Assert.Throws(()=>api.GetDataUsingDataContract(null));
Assert.That(exception.Message,Is.Not.Null.或.Empty);
Assert.That(exception.Message,Is.StringContaining(“source”));
}

由于该方法本身不会抛出,因此您的覆盖率将为100%。

您应该分析测试覆盖的代码百分比。非测试本身(我甚至不知道什么涵盖了您的测试)还请记住,行级别的覆盖率不是一个很好的指标,也不完全是重点。关键是,发生真正糟糕的事情的剩余风险是什么?这是否意味着,你有单元测试2来测试其他单元测试1,并获得这些单元测试1的100%覆盖率?然后是另一组单元测试#3以获得单元测试#2的100%覆盖率?来吧单元测试应该足够简单,不需要测试本身。如果不是,那你就错了。听起来编码标准与测试标准相矛盾。只有使两者在同一地点和时间重合,导致相互湮灭或进一步的一系列会晤,才能解决这一问题,好吧,我理解所有认为100%测试代码覆盖率是愚蠢的想法的火焰,但我个人认为花括号是唯一站在你和100%测试代码覆盖率之间的东西是愚蠢的。好吧,但是你没有100%的分支覆盖率。但是我想你确实回答了基本假设——100%的测试代码覆盖率并不比99%好,如果正如Savanna所指出的,没有100%的测试代码覆盖率的唯一原因是花括号,那么100%对于你的测试来说是不必要的。你已经拥有的一切都很好。
[Test]
public void Api_GetDataUsingDataContractWithNullParameter_ThrowsArgumentNullException()
{
    var api = new Api();
    var exception = Assert.Throws<ArgumentNullException>(() => api.GetDataUsingDataContract(null));
    Assert.That(exception.Message, Is.Not.Null.Or.Empty);
    Assert.That(exception.Message, Is.StringContaining("source"));
}