2011-07-11 139 views

回答

17

你不需要在try/catch中包裝GetNumber()。如果GetNumber()拋出,你的測試將失敗。

如果您需要明確地使其失敗,請使用Assert.Fail();

+2

在這種特殊情況下,您應該使用Assert.DoesNotThrow(()=> GetNumber())' – RJFalconer

1

所有測試都應該通過,如果您預期有異常,您應該使用ExpectedException屬性。如果你的代碼拋出預期的異常測試將通過。

1

Assert.Fail()http://www.nunit.org/index.php?p=utilityAsserts&r=2.2.7

雖然,可能是有一個斷言Assert.NoThrow,或類似的東西,從而確保您的方法不拋出。

+0

ok,no Assert.NoThrow。太糟糕了,我覺得它更可讀 –

+1

檢查更新的版本。 [Assert.DoesNotThrow](http://www.nunit.org/index.php?p=exceptionAsserts&r=2.6) –

+0

不錯!感謝您的鏈接 –

3

如果GetNumber()返回一個值,那麼你不應該做你想做的事。相反,你應該聲明返回值。如果您不希望出現異常,請不要打擾檢查異常情況。 NUnit框架將照顧到這一點,併爲您的測試失敗。

如果GetNumber()不返回一個值,你可以做的三兩件事之一:

  1. 使用Assert.DoesNotThrow - 這很明確地記載意圖
  2. 至於其他人建議,你可以簡單地選擇不捕捉異常。測試失敗已經被異常告知。任何未捕獲的異常都將通過測試
  3. 如果您有充分理由顯式失敗或通過測試,並且沒有其他可以使用的斷言塊(更好地記錄測試意圖的塊) ,使用Assert.Fail/Assert.Pass

在這種情況下,第一個選項是最明確的。如果您可以驗證的唯一有趣的副作用是拋出異常,這很常見。但是,如果GetNumber()不返回一個值,你真的應該考慮重命名你的方法:)

+1

順便說一句,如果您發現自己處於情況# 3因爲你有複雜的驗證邏輯,你可能想嘗試[使用自定義約束類斷言](http://www.nunit.org/index.php?p=constraintModel&r=2.5.9)。儘管如此,你並沒有在這裏進行非常複雜的斷言,所以我將它保存爲另一個測試用例:) –

0
[Test()] 
public void Test() 
{ 
    GetNumber(); 
} 

失敗測試等同於從它拋出異常。因此,如果您的方法拋出測試將失敗。