ThrowingException是否导致UnitTest中断?

时间:2019-01-03 08:04:15

标签: c# unit-testing nunit

我有一种情况,在某些情况下,实际函数会引发异常,因此我为此编写了单元测试,但不幸的是,单元测试失败。

示例代码

// 'CheckNumber()' function is Present in 'Number' class.

public int CheckNumber(int Number)
{
    if (Number < 0 || Number > MaxNumber) // MaxNumber = 300
       throw new ArgumentOutOfRangeException();

    //..     
}     

单元测试

我正在使用 NUnit Framework

// When The Number is Less than Zero Or Greater than Maximun Number

[Test]
public void CheckNumberTest()
{
   Number number = new Number();
   int returnedValue = number.CheckNumber(-1);

   // Assertion.
   Assert.That(returnedValue , Throws.ArgumentOutOfRangeException);
}

我运行测试时此测试失败。该测试实际上引发了异常,而TestMethod即将中断?那么如何解决呢?

2 个答案:

答案 0 :(得分:1)

请检查文档docker role

,您当然需要了解同一链接中异常之间的差异 这应该可以帮助您彻底

// Require an ApplicationException - derived types fail!
Assert.Throws( typeof(ApplicationException), code );
Assert.Throws<ApplicationException>()( code );

// Allow both ApplicationException and any derived type
Assert.Throws( Is.InstanceOf( typeof(ApplicationException), code );
Assert.Throws( Is.InstanceOf<ApplicationException>(), code );

// Allow both ApplicationException and any derived type
Assert.Catch<ApplicationException>( code );

// Allow any kind of exception
Assert.Catch( code )

答案 1 :(得分:1)

这里的问题是您的方法不返回任何值,而是引发异常。

int returnedValue = number.CheckNumber(-1); //throws ArgumentOutOfRangeException

测试代码会像其他所有代码一样执行,并且会在有人抓住它之前使异常冒泡。您的情况是它被测试执行程序捕获,因为您在这里没有任何try / catch块。

编写测试的正确方法是使用Assert.Throws<TException>

[Test]
public void CheckNumberTest()
{
    //Arrange
   Number number = new Number();

   //Act
   var throws = new TestDelegate(() => number.CheckNumber(-1));

   //Assert.
   Assert.Throws<ArgumentOutOfRangeException>(throws);
}