2011-11-03 85 views
11

我通常使用Nunit,但是在我當前的項目中,我正在使用MSTest。現在我有一個測試,期望有一個例外,但仍然失敗,我不知道爲什麼。MSTest ExpectedException失敗

這裏是我用來複制的問題一個簡單的例子:

[TestMethod, ExpectedException(typeof(ErrorResponseException))] 
     public void should_throw_exception() 
     { 
      throw new ErrorResponseException(); 
     } 

的ErrorResponseException是剛剛從異常繼承的類,這是它,任何人都知道這是爲什麼失敗,我希望它通過。

回答

14

在NUnit中,我會避​​免ExpectedException並使用Assert.Throws(異常斷言)。它給你更細緻的控制。否則如果測試方法的任何部分拋出異常,測試將通過。

在MSTest的,你可以得到與老派施工管理同級別:

try 
{ 
    // code that you expect to throw goes here 
    Assert.Fail("Expected MyException"); 
} 
catch (MyException ex) 
{ 
    // optionally assert on the message - this can make tests fragile though 
} 

有了這個,就沒有必要爲的ExpectedException屬性。

(這個概念來自於書本測試驅動開發:由大衛Astels的實用指南。)

+0

在我的實際情況是非常相似,你說把它傳遞的那一刻是什麼,我只是覺得奇怪它在MSTest中不起作用。那麼將繼續使用這種做法。 – Grofit

+3

MSTest不正確地支持它,它是一個錯誤。這也是超級跛腳!上述解決方法將正常工作 –

3

無恥的插頭,但我寫了一個簡單的裝配,使得主張對異常和異常消息變得更輕鬆,更可在MSTest中使用Assert.Throws()語法。我寫了一個blog post與全部細節。

3

如果您使用的是MSTest 10.0.1.0.0,ExpectedException似乎無法正常工作,請改爲使用10.0.0.0.0。

+1

正確。我現在面臨這個問題。 – orange

2

我剛剛遇到同樣的問題,發現了另一個解決方案。我的測試方法是async,但在我的測試方法中,我忘記了調用的關鍵字。

測試:

[TestMethod] 
    [ExpectedException(typeof(InvalidOperationException))] 
    public async Task ShouldDoSomething(){ 
     // notice the missing await in the next line 
     this.testObject.DoSomethingAsync(); 
    } 

的方法測試:

 public async Task<bool> DoSomethingAsync(){ 
      if(something) 
      { 
       throw new InvalidOperationException("Error while doing something"); 
      } 
      return false; 
     } 

當我跑我的測試是這樣失敗了。但只要我將測試更改爲以下內容:

[TestMethod] 
[ExpectedException(typeof(InvalidOperationException))] 
public async Task ShouldDoSomething(){ 
    await this.testObject.DoSomethingAsync(); 
} 

它爲我工作。

0

ExpectedExceptionAttribute現在在多個DLL中定義,並且單元測試運行器可能希望從不同的DLL看到您的測試項目正在使用的屬性。

作爲一個例子,我在VS2017中創建了一個單元測試項目,它從MicrosoftVisualStudio.TestPlatform.TestFramework V14.0.0.0獲取ExpectedException - 測試通過IDE但在TeamCity中失敗,即使使用VSTest亞軍在版本2017.

我最終通過刪除在我的測試項目中的這個DLL的所有引用,並用Mirosoft.VisualStudio.QualityTools的10.0.0.0版本替換它們,以通過TeamCity。UnitTestFramework

1

Visual Studio 15MSTest.TestAdapter v1.1.18MSTest.TestFramework v1.1.18依賴你也可以使用

Assert.ThrowsException<ArgumentNullException>(() => MethodThatThrowsArgumentNullException());