Unit testing 在nUnit中预期异常,但不具有ExpectedException属性

Unit testing 在nUnit中预期异常,但不具有ExpectedException属性,unit-testing,exception,nunit,Unit Testing,Exception,Nunit,我有多个参数的方法,它们通过在任何参数为null时抛出ArgumentNullExceptions和ArgumentExceptions来防止错误输入 因此,有两种明显的方法来测试这一点: 使用[ExpectedException]属性对每个参数进行一次测试 使用多个try{}catch块对所有参数进行一次测试 试一试就是这样的: try { controller.Foo(null, new SecondParameter()); Assert.Fail("Argument

我有多个参数的方法,它们通过在任何参数为null时抛出ArgumentNullExceptions和ArgumentExceptions来防止错误输入

因此,有两种明显的方法来测试这一点:

  • 使用[ExpectedException]属性对每个参数进行一次测试
  • 使用多个try{}catch块对所有参数进行一次测试
试一试就是这样的:

try 
{
    controller.Foo(null, new SecondParameter());
    Assert.Fail("ArgumentNullException wasn't thrown");
} catch (ArgumentNullException)
{}
有一个小问题。如果测试通过,则永远不会调用Assert.Fail,因此将突出显示为未覆盖的测试代码(由NCover)


我知道这实际上不是问题,因为这是我想要100%覆盖率的业务代码,而不是测试代码。但我还是很好奇,是否有一种方法可以将多个异常抛出调用压缩到一个测试用例中而不产生死区?

好吧,您可以通过提取实用方法将其简化为一个死区,例如

public void ExpectException<T>(Action action) where T : Exception
{
    try
    {
        action();
        Assert.Fail("Expected exception");
    }
    catch (T)
    {
        // Expected
    }
}
public void-ExpectException(Action-Action),其中T:Exception
{
尝试
{
动作();
Assert.Fail(“预期异常”);
}
渔获物(T)
{
//期望
}
}
称之为:

ExpectException<ArgumentNullException>
    (() => controller.Foo(null, new SecondParameter());
ExpectException
(()=>controller.Foo(null,新的SecondParameter());
(当然,您不需要将其封装在IDE中……SO上的行长度非常短。)

From NUnit现在在其扩展程序集中包含Andreas Schlapsi编写的RowTest扩展。此扩展允许您编写接受参数的测试方法,并使用RowAttribute提供多组参数值。若要使用RowTest,您的测试必须引用NUnit.framework.extensions程序集

它向NUnit添加了来自MbUnit的行测试功能

你可以这样写:

[RowTest]
[Row(1, 2, 3)]
[Row(3, 4, 8, TestName="Special case")]
[Row(10, 10, 0, TestName="ExceptionTest1"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
[Row(1, 1, 0, TestName="ExceptionTest2"
    , ExpectedException=typeof(ArgumentException)
    , ExceptionMessage="x and y may not be equal.")]
public void AddTest(int x, int y, int expectedSum)
{
  int sum = Sum(x, y);
  Assert.AreEqual(expectedSum, sum);
}
代码来自Nunit RowTestExtension的源代码