2017-05-18 110 views
2

開始實施在C#單元測試,使用的MSTest單元測試,測試的ExpectedException失敗雖然異常被拋出

在這個特殊的測試我想驗證一個ArgumentNullException被拋出。即使我的代碼確實會拋出異常,但我的測試失敗了,因爲它顯然沒有收到該類型的異常。

我哪裏錯了?註定是簡單的東西....

我的測試是這樣的:

[TestMethod()] 
[ExpectedException(typeof(ArgumentNullException), "A null HttpContent was inappropriately allowed")] 
public void Test_HttpContent_Null_Throws_Exception() 
{ 
    MultipartFormDataMemoryStreamProvider provider = new MultipartFormDataMemoryStreamProvider(); 
    Assert.ThrowsException<ArgumentNullException>(()=>provider.GetStream(null, null)); 
} 

而且GetStreams()方法是這樣的:

public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     if (parent == null) 
      throw new ArgumentNullException("parent"); 

     if (headers == null) 
      throw new ArgumentNullException("headers"); 

     var contentDisposition = headers.ContentDisposition; 
     if (contentDisposition == null) 
      throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part."); 

     _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName)); 
     return base.GetStream(parent, headers); 
    } 
+0

只是好奇,似乎每個人都使用xUnit或NUnit這些天。是什麼促使你選擇MSTest?我不是想開始一場辯論或者激烈的戰爭,但是我很驚訝任何人都會在2017年選擇它 – Novaterata

+0

這是一個公平的問題。最終,它隨Visual Studio一起提供,並且是.Net默認值。我事先做了一些谷歌搜索,找不到任何明確的,沒有偏見的寫作。簡而言之,你更喜歡哪個?爲什麼?在我們開始在公司範圍內實施之前,我在這些測試中還處於早期階段,並且可以輕鬆切換它們。另外,我們也會編寫集成測試 - 想想我在MSTest更好地處理這些東西的地方閱讀某些東西(不記得我在哪裏讀取它) – Darren

+0

我只使用NUnit 2和3,NUnit 2是一個並行化的痛苦,我不得不自己推出,但NUnit 3解決了這個問題。對我來說主要的是對參數化測試和測試套件(TestFixtures)的支持。這是我的理解,MSTest不支持參數化測試,但也許在V2中改變了。 xUnit似乎是單元測試的新金標準。它由.NET Core和MSBuild使用,因爲MS Test不是跨平臺的。我沒有強烈的意見,但你可能會選擇測試框架的WinForms,並想警告你。 – Novaterata

回答

3

在此行中的斷言被處理異常:

Assert.ThrowsException<ArgumentNullException>(()=>provider.GetStream(null, null)); 

因此,測試框架沒有看到它被拋出就ExpectedException而言。您可以刪除該屬性或斷言:

[TestMethod()] 
[ExpectedException(typeof(ArgumentNullException), "A null HttpContent was inappropriately allowed")] 
public void Test_HttpContent_Null_Throws_Exception() 
{ 
    MultipartFormDataMemoryStreamProvider provider = new MultipartFormDataMemoryStreamProvider(); 
    provider.GetStream(null, null); 
} 
+0

阿格。這會教我跳過教程:)謝謝詹姆斯。 – Darren