2010-05-17 128 views
0

比方說,我有一個接受用戶名和密碼的功能,它就從數據庫中檢索記錄,並對這些數據進行以下檢查編寫測試失敗的單元測試?

  • 今天的日期是一個日期範圍
  • 用戶是外禁用
  • 的參數比較時

如果任何這些條件爲真則拋出異常。

很顯然,我想要寫我的單元測試,以測試他的邏輯,但是如果我做了一個會拋出異常,我的測試將失敗,這是不正確的 - 是什麼呢?

回答

2

是的,你的測試將正確地拋出一個異常,但在大多數(全部?)測試框架,您可以指定預期的異常,測試會通過。

在MSTest的和NUnit

[ExpectedException(typeof(ArgumentException))] 

只是要小心其中可能拋出異常的情況下,但對於那些比你預期等原因。

6

既然你沒有說你正在使用哪個測試框架,我不能進入具體細節,但是框架將允許你將測試標記爲期望異常。當拋出異常時,這將停止測試失敗,並允許您檢查異常本身的類型和內容。另一方面,如果您使用的框架不支持這個功能(儘管我不認爲有任何不支持),您可以在測試中手動添加try ... catch塊,以便異常不會傳播出去並導致測試失敗。

+0

+1 - 正是你應該做的。大多數單元測試框架允許您繼續前進,並且如果不拋出期望的異常,將會失敗。單元測試不僅應該測試那些功能在給定條件成功時工作,而且在沒有這些條件的情況下適當地失敗。 – 2010-05-17 09:16:01

1

我不知道我在這裏看到問題。有合同主叫方和被叫方和,該合同是否涉及異常之間被拋出,或錯誤返回碼(例如,如果將例外被叫內捕獲並轉換成返回代碼),你只需要檢查問題是否以某種方式發出信號。

例如,如果你的合同規定的getDbRow()將拋出DbNotOpenException如果數據庫未打開,這樣做:

db.Close() 
try: 
    x = db.getDbRow() 
catch DbNotOpenException e: 
    return PASSED_TEST 
return FAILED_TEST 

換句話說,如果你的單元測試期望爲給定的特定異常情況下,他們應該陷入困境並報告說沒問題。如果發生異常不發生,他們應該標記失敗。