2011-11-21 89 views
14

我有一些測試,我在檢查參數名稱在例外。 我如何在MS TEST中編寫此代碼?斷言從NUnit異常到MS測試

ArgumentNullException exception = 
       Assert.Throws<ArgumentNullException>(
          () => new NHibernateLawbaseCaseDataLoader( 
               null, 
               _mockExRepository, 
               _mockBenRepository)); 

Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 

我一直希望有一個整潔的方式,所以我可以避免在測試中使用try catch塊。

回答

29
public static class ExceptionAssert 
{ 
    public static T Throws<T>(Action action) where T : Exception 
    { 
    try 
    { 
     action(); 
    } 
    catch (T ex) 
    { 
     return ex; 
    } 

    Assert.Fail("Expected exception of type {0}.", typeof(T)); 

    return null; 
    } 
} 

您可以使用上面的擴展方法作爲測試助手。下面是如何使用它的一個例子:

// test method 
var exception = ExceptionAssert.Throws<ArgumentNullException>(
      () => organizations.GetOrganization()); 
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 
+0

像你在你的第二個代碼塊中圍繞這個 – cpoDesign

+0

工作的方式不是更正確的檢查異常!= null? – syclee

+0

您可以爲其餘的異常添加另一個catch塊,並說「預期的異常是abc但得到了xyz」。 – Hash

3

由於MSTest [ExpectedException]屬性不檢查郵件中的文本,所以最好的辦法就是嘗試...在異常消息/參數名屬性上捕獲並設置Assert。

7

無恥的插頭,但我寫了一個簡單的裝配,使得使用Assert.Throws()語法斷言異常和異常信息更容易一點,在MSTest的可讀性更強採用nUnit/xUnit的風格。

您可以通過下載從的NuGet包:PM>安裝,包裝MSTestExtensions

或者,你可以看到完整的源代碼在這裏:https://github.com/bbraithwaite/MSTestExtensions

高級指令,下載安裝和繼承BaseTest並且您可以使用Assert.Throws()語法。

主要方法爲拋出執行如下所示:

public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception 
{ 
    try 
    { 
     task(); 
    } 
    catch (Exception ex) 
    { 
     AssertExceptionType<T>(ex); 
     AssertExceptionMessage(ex, expectedMessage, options); 
     return; 
    } 

    if (typeof(T).Equals(new Exception().GetType())) 
    { 
     Assert.Fail("Expected exception but no exception was thrown."); 
    } 
    else 
    { 
     Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T))); 
    } 
} 

更多信息here

+0

@joran我應該補充,我等待着你對這個問題的答案... –

+0

我沒有什麼可以奉獻的,但我很感激你的!我希望你對我的評論沒有冒犯。雖然我在專業領域的專業知識在於完全不同的學科領域,但我儘可能地通過編輯回饋網站,並鼓勵像您這樣的人提出更高質量的答案。這一切都歸功於一個對其他人來說更有價值的資源。 – joran

+0

@joran公平夠:) –