C# 在NUnit 3中使用[TestCase]属性测试异常?

C# 在NUnit 3中使用[TestCase]属性测试异常?,c#,.net,exception,nunit,testcase,C#,.net,Exception,Nunit,Testcase,如何使用NUnit3在测试用例中测试异常? 假设我有一个方法Divide(a,b),定义如下: public double Divide(double a, double b) { if(Math.Abs(b) < double.Epsilon) throw new ArgumentException("Divider cannot be 0"); return a/b; } 是否有一种方法可以指定一个测试用例,该测试用例将导致Divide()抛出ArgumentExce

如何使用NUnit3在测试用例中测试异常?

假设我有一个方法
Divide(a,b)
,定义如下:

public double Divide(double a, double b)
{
    if(Math.Abs(b) < double.Epsilon) throw new ArgumentException("Divider cannot be 0");
    return a/b;
}
是否有一种方法可以指定一个测试用例,该测试用例将导致Divide()抛出ArgumentException,并以某种方式将其作为预期结果,例如,类似以下内容的内容:

[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
[TestCase(-1, 0, ExpectedResult = TypeOf(ArgumentException)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}

(当然,我可以定义一个单独的测试方法,并在其中使用
Assert.Throws()
,因此这纯粹是出于好奇)

ExpectedException
本来是NUnit 2.X的正确方法,但它已从NUnit 3中删除


在和等效的开发小组中有各种各样的讨论片段,但看起来决定了它通常是一种更好的设计模式,可以测试预期的结果,并在不同的方法中测试异常。()

在NUnit 3中实现这一点的唯一方法是将其分解为两个单独的测试。(在NUnit核心团队回答的类似问题中确认,)

[TestCase(-10,2,5)]
[测试用例(-1,2,-0.5)]
公共void TestDivide(双a、双b、双结果)
{
断言(_uut.Divide(a,b),即.EqualTo(result));
}
[测试用例(-1,0)]
公共void TestDivideThrows(双a,双b)
{
Assert.That(()=>_uut.Divide(a,b),抛出.TypeOf());
}

我同意巨兽语料库的答案,但为什么不简化一下:

[TestCase(-10,2,5)]
[测试用例(-1,2,-0.5)]
[TestCase(-1,0,null,typeof(ArgumentException))]
public void TestDivide(双a、双b、双结果,类型exception=null)
{
if(异常!=null)
{
抛出(异常,委托{{u uut.Divide(a,b);});
}else断言:(_uut.Divide(a,b),即.EqualTo(result));
}

这样,预期的异常也是测试参数的一部分,请注意,您只能有两个结果,分割成功或抛出。

如果您真的想将这两个结果强制到一个测试用例中,您可以添加一个布尔throwsException参数并对其进行测试。然而,如果存在if-then-else和两个完全不同的期望值,这将证明这确实应该是两个不同的测试。当使用静态方法调用时,较低的语法似乎在我的系统(NUnit 3.2.1)上不起作用…-有趣的是,
Assert.Throws(()=>MyStaticClass.MyStaticMethod(badparameter))
确实有效。谢谢@ChriPf-我认为它应该是一个函数。我编辑过它,“通常是一个更好的设计模式来测试预期的结果,在不同的方法中出现异常”-我不能在我的代码上更新nunit框架,除非重构1000多个测试,因为“通常是更好的设计模式”。这并不是一个很好的解释打破改变的方法伟大的提示有一个+1先生
[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
[TestCase(-1, 0, ExpectedResult = TypeOf(ArgumentException)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}
[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
public void TestDivide(double a, double b, double result)
{
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}

[TestCase(-1, 0)]
public void TestDivideThrows(double a, double b)
{
    Assert.That(() => _uut.Divide(a, b), Throws.TypeOf<ArgumentException>());
}