2008-12-22 43 views
3

我有多於一個參數的方法,通過在任何參數爲空時拋出ArgumentNullExceptions和ArgumentExceptions來防止錯誤輸入。預計nUnit中沒有ExpectedException屬性的異常

因此有兩個明顯的方式來測試這一點:

  • 一個使用[的ExpectedException]屬性使用的所有參數
  • 一次測試多種嘗試{} catch塊
每個參數測試

嘗試捕捉的東西看起來像這樣:

try 
{ 
    controller.Foo(null, new SecondParameter()); 
    Assert.Fail("ArgumentNullException wasn't thrown"); 
} catch (ArgumentNullException) 
{} 

With with小問題。如果測試通過,Assert.Fail永遠不會被調用,因此將被突出顯示爲未覆蓋的測試代碼(由NCover提供)。

我知道這實際上並不是問題,因爲它是我希望100%覆蓋的業務代碼,而不是測試代碼。我仍然很好奇,如果有一種方法可以將多個異常拋出的調用壓縮到一個測試用例中而不會導致死亡的LoCs?

回答

6

release notes of NUnit 2.4.7 NUnit現在在其擴展程序集中包含由Andreas Schlapsi編寫的RowTest擴展。此擴展允許您編寫帶有參數的測試方法,並使用RowAttribute提供多組參數值。要使用RowTest,您的測試必須引用nunit.framework.extensions程序集。

它向NUnit添加了來自MbUnit的RowTest功能。

可以比寫類似:

[RowTest] 
[Row(1, 2, 3)] 
[Row(3, 4, 8, TestName="Special case")] 
[Row(10, 10, 0, TestName="ExceptionTest1" 
    , ExpectedException=typeof(ArgumentException) 
    , ExceptionMessage="x and y may not be equal.")] 
[Row(1, 1, 0, TestName="ExceptionTest2" 
    , ExpectedException=typeof(ArgumentException) 
    , ExceptionMessage="x and y may not be equal.")] 
public void AddTest(int x, int y, int expectedSum) 
{ 
    int sum = Sum(x, y); 
    Assert.AreEqual(expectedSum, sum); 
} 

http://www.andreas-schlapsi.com/2008/03/31/nunit-247-includes-rowtest-extension/ 的代碼是從NUnit的RowTestExtension源代碼在Google code

7

那麼,你可以通過提取一種實用方法將它縮減爲單一的死亡線。

public void ExpectException<T>(Action action) where T : Exception 
{ 
    try 
    { 
     action(); 
     Assert.Fail("Expected exception"); 
    } 
    catch (T) 
    { 
     // Expected 
    } 
} 

與調用它:

ExpectException<ArgumentNullException> 
    (() => controller.Foo(null, new SecondParameter()); 

(你不會需要將其包裝在一個IDE,當然......在太行的長度很短。)

相關問題