测试异常处理

时间:2018-05-07 08:24:33

标签: c# nunit

我必须测试以下代码。

AttributeError: 'list' object has no attribute info().

如何使用NUnit测试是否已正确处理异常?

2 个答案:

答案 0 :(得分:3)

显式检查没有抛出异常的最惯用的方法是使用Assert.DoesNotThrow语法。

举个例子:

public class ClassUnderTest {
    public void SampleMethod(FooBarObject fooBarObject) {
        try { 
            fooBarObject.Name = "Never forget a towel";
            fooBarObject.Number = 42;
        }
        catch (NullReferenceException){}
    }
}

[Test]
public void Given_A_Class_Under_test_When_Calling_The_Sample_Method_It_Should_Not_Throw() {
    var sut = new ClassUnderTest();

    Assert.DoesNotThrow(() => sut.SampleMethod(null));
}

需要注意的是,它只是一个包罗万象,因为你只是断言没有抛出异常,而不是异常是以某种特殊方式处理的异常处理

刚刚看到CodeNotFound的回答,我建议采用他的防御性编码方法,这是一种常见的采用模式,并且会尽可能保持您的方法清洁。明确检查,提前失败并处理调用链上方的余波,而不是仅仅吞下空引用异常。

答案 1 :(得分:3)

您有两种选择:

您应该传递SampleMethod(null)值,因此只需为测试的行为部分调用throw

Side Note n°1:要使测试成为绿色,您需要使用NullReferenceException将异常重新抛出到catch块中。

Side Note n°2: 抓住public void SampleMethod(FooBarObject fooBarObject) { if (fooBarObject == null) { throw new ArgumentNullException(nameof(fooBarObject)); } fooBarObject.Name = "Never forget a towel"; fooBarObject.Number = 42; } 非常罕见。你需要重构你的方法并使用如下的防御性编码:

{{1}}

使用类似代码测试所有参数在使用方法参数之前是否有效。