2015-03-19 21 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