如何验证使用某个参数抛出异常?

时间:2015-03-19 07:29:36

标签: c# exception

假设我有以下异常和方法:

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)],但我不知道这些例外中的哪一个。

1 个答案:

答案 0 :(得分:1)

  

我通常会选择[ExpectedException(typeof(MyException)]

我建议你不要那样做。你还没有告诉我们你正在使用哪个单元测试框架,但是现在大多数都提供了类似的东西:

Assert.Throws<MyException>(() => testSubject.DoSomething());

除了其他任何内容之外,这将确保异常仅在您预期的位置抛出 - 而不是其他地方。

接下来,根据您的框架,您可能会发现Assert.Throws返回抛出的异常,因此您可以在其中验证:

var exception = Assert.Throws<MyException>(...);
Assert.AreEqual("A", exception.Message);

请注意,测试确切的消息通常非常脆弱 - 但如果它正在测试关于异常的其他内容(例如ArgumentException.ParamName)那么更明确。