2015-03-19 80 views
0

假设我有以下异常和方法:如何验证使用某个参数抛出的异常?

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

我通常[ExpectedException(typeof(MyException)]

去,我建议你做到这一点。你还没有告诉我们您正在使用的单元测试框架,但这些天最提供类似:

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

除了别的,这将确保异常被抛出只有在您希望它是 - 不在其他地方。

接下来,根据您的框架中,你可能会发现Assert.Throws返回异常抛出,这样你就可以验证的东西在于:

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

需要注意的是测试的确切消息一般是很脆 - 但如果它正在测试其他有关该例外情况的其他内容(例如ArgumentException.ParamName),这是更清晰的。

+0

感谢您的回答。我使用Moq,它似乎没有'Assert.Throws'。任何类似的选项? – JohnoBoy 2015-03-19 07:38:56

+0

@JohnoBoy:Mo​​q只是一个嘲讽的库 - 它本身不是一个单元测试库。当然,您还可以使用其他*以及Moq,例如NUnit,xUnit?如果你不是,你应该是。 – 2015-03-19 07:40:06

+0

我的不好。我正在使用Visual Studio单元测试框架。缺少这个功能可能会导致切换... – JohnoBoy 2015-03-19 07:43:49