如何验证某个参数是否引发了异常?

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),那就更明确了。