假设我有以下异常和方法:
public MyException(string type)
{
/* Does soemthing with the parameter */
}
public void DoSomething()
{
// ...
if (/* some rule */)
throw new MyException("A");
else
{
throw new MyException("B");
}
}
我想测试我的方法,如何使用Visual Studio单元测试框架验证MyException
是否抛出了特定参数?我通常会使用[ExpectedException(typeof(MyException)]
,但我不知道这些例外中的哪一个。
答案 0 :(得分:1)
我通常会选择
[ExpectedException(typeof(MyException)]
我建议你不要那样做。你还没有告诉我们你正在使用哪个单元测试框架,但是现在大多数都提供了类似的东西:
Assert.Throws<MyException>(() => testSubject.DoSomething());
除了其他任何内容之外,这将确保异常仅在您预期的位置抛出 - 而不是其他地方。
接下来,根据您的框架,您可能会发现Assert.Throws
返回抛出的异常,因此您可以在其中验证:
var exception = Assert.Throws<MyException>(...);
Assert.AreEqual("A", exception.Message);
请注意,测试确切的消息通常非常脆弱 - 但如果它正在测试关于异常的其他内容(例如ArgumentException.ParamName
)那么更明确。