epi*_*tka 226 c# nunit exception assertions
如何使用Assert.Throws断言异常的类型和实际的消息措辞.
像这样的东西:
Assert.Throws<Exception>(
()=>user.MakeUserActive()).WithMessage("Actual exception message")
Run Code Online (Sandbox Code Playgroud)
我正在测试的方法抛出多个相同类型的消息,使用不同的消息,我需要一种方法来测试是否根据上下文抛出了正确的消息.
Pat*_*gne 408
Assert.Throws 返回抛出的异常,它允许您对异常进行断言.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Run Code Online (Sandbox Code Playgroud)
因此,如果没有抛出异常,或抛出错误类型的异常,则第一个Assert.Throws断言将失败.但是,如果抛出了正确类型的异常,那么现在可以断言已保存在变量中的实际异常.
通过使用此模式,您可以在除异常消息之外的其他事物上断言,例如在ArgumentException和衍生物的情况下,您可以声明参数名称是正确的:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
Run Code Online (Sandbox Code Playgroud)
您还可以使用流畅的API来执行这些断言:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
Run Code Online (Sandbox Code Playgroud)
在异常消息上断言时的一个小提示是使用它来装饰测试方法,SetCultureAttribute以确保抛出的消息正在使用预期的文化.如果您将异常消息存储为允许本地化的资源,则会发挥作用.
Jac*_*ope 24
您现在可以使用ExpectedException属性,例如
[Test]
[ExpectedException(typeof(InvalidOperationException),
ExpectedMessage="You can't do that!"]
public void MethodA_WithNull_ThrowsInvalidOperationException()
{
MethodA(null);
}
Run Code Online (Sandbox Code Playgroud)
Jor*_*ris 13
Assert.That(myTestDelegate, Throws.ArgumentException
.With.Property("Message").EqualTo("your argument is invalid."));
Run Code Online (Sandbox Code Playgroud)
对于那些使用NUnit 3.0 约束模型并最终到达这里的人:
Assert.That(() => MethodUnderTest(someValue), Throws.TypeOf<ArgumentException>());
Run Code Online (Sandbox Code Playgroud)
一个实际有效的解决方案:
public void Test() {
throw new MyCustomException("You can't do that!");
}
[TestMethod]
public void ThisWillPassIfExceptionThrown()
{
var exception = Assert.ThrowsException<MyCustomException>(
() => Test(),
"This should have thrown!");
Assert.AreEqual("You can't do that!", exception.Message);
}
Run Code Online (Sandbox Code Playgroud)
这适用于using Microsoft.VisualStudio.TestTools.UnitTesting;.