2013-04-11 117 views
7

我使用Visual Studio單元測試框架的情況非常奇怪。裝飾爲[TestMethod, ExpectedException(typeof(InvalidOperationException))]的測試失敗System.InvalidOperationExceptionExpectedException屬性不起作用

如果我從測試中刪除所有代碼(以確保它不會拋出任何東西) - 它會通過。這就好像ExpectedException甚至沒有...

如果我開始一個虛擬測試的空項目,只會拋出InvalidOperationException它完全按預期工作。

已驗證,ExpectedExceptionAttributeInvalidOperationException都未被覆蓋。不知道還有什麼嘗試在這裏...


編輯:通過去除參考Microsoft.VisualStudio.QualityTools.UnitTestFramework 10.1和10.0版本中加入解決了這一問題。 不知道爲什麼這個問題或爲什麼其他屬性工作得很好。

+0

如果你的問題的項目,您從測試中刪除所有的代碼,只需添加一行拋出InvalidOperationException異常,是否按預期方式工作(即通過即使它拋出例外?) – 2013-04-11 21:50:19

+0

@MattSmith不,測試失敗。 – 2013-04-11 21:51:20

+0

有趣的問題,很好找。 – Eogcloud 2013-06-25 07:41:51

回答

3

就我個人而言,我不使用ExpectedExeption屬性,因爲它不允許您準確指定哪個語句將引發異常。例如,在測試設置代碼中可能會出現一些問題,這些代碼會拋出一個InvalidOperationExeption,這個InvalidOperationExeption在您的測試中未被執行,並且突然通過了您的測試。此外,它不允許你檢查Exeception,就像聲明它有正確的信息。

我用下面的辦法

[TestMethod] 
public void Test() 
{ 
    //Arrange 
    var sut = new ClassToTest(); 
    sut.MethodThatShouldNotThrow(); 

    //Act 
    try 
    { 
     sut.MethodToTestThatShuldThrow(); 
    } 
    catch(InvalidOperationException ioex) 
    { 
     //Assert, here you could do additional Asserts on the Exception's properties  
     return; 
    } 
    Assert.Fail("Expected InvalidOperationException was not thrown"); 
}