我必须测试以下代码。
AttributeError: 'list' object has no attribute info().
如何使用NUnit测试是否已正确处理异常?
答案 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)
您有两种选择:
ExpectedException
方法。请检查此链接:https://github.com/nunit/docs/wiki/Assert.Throws null
属性装饰您的测试方法。从Nunit开始第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}}
使用类似代码测试所有参数在使用方法参数之前是否有效。