如何验证某个参数是否引发了异常?
How can I verify an exception was thrown with a certain parameter?
假设我有以下异常和方法:
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)]
,但我不知道这些例外中的哪一个。
I'd usually go with [ExpectedException(typeof(MyException)]
我建议你不要这样做。您还没有告诉我们您使用的是哪个单元测试框架,但现在大多数提供如下内容:
Assert.Throws<MyException>(() => testSubject.DoSomething());
除此之外,这将确保异常仅在您期望的地方抛出 - 而不是在其他地方。
接下来,根据您的框架,您可能会发现 Assert.Throws
returns 抛出异常,因此您可以验证其中的内容:
var exception = Assert.Throws<MyException>(...);
Assert.AreEqual("A", exception.Message);
请注意,测试确切的消息通常非常脆弱 - 但如果它正在测试有关异常的其他内容(例如 ArgumentException.ParamName
),那就更明确了。
假设我有以下异常和方法:
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)]
,但我不知道这些例外中的哪一个。
I'd usually go with
[ExpectedException(typeof(MyException)]
我建议你不要这样做。您还没有告诉我们您使用的是哪个单元测试框架,但现在大多数提供如下内容:
Assert.Throws<MyException>(() => testSubject.DoSomething());
除此之外,这将确保异常仅在您期望的地方抛出 - 而不是在其他地方。
接下来,根据您的框架,您可能会发现 Assert.Throws
returns 抛出异常,因此您可以验证其中的内容:
var exception = Assert.Throws<MyException>(...);
Assert.AreEqual("A", exception.Message);
请注意,测试确切的消息通常非常脆弱 - 但如果它正在测试有关异常的其他内容(例如 ArgumentException.ParamName
),那就更明确了。