2011-10-26 53 views
1

我有很多以下類型的代碼(每個代碼都從不同的表中獲取數據)。如何編寫異常處理的自動化測試

public class TableOneDAO 
{ 
    public TableOneDAO(IDbConnection dbConnection) 
    { 
     _dbConnection = dbConnection; 
     _log = LogFacade.GetLog(); 
     _tableOneRowMapper = new TableOneRowMapper(); 
    } 

    public IList<TableOneRecord> FindAll() 
    { 
     try 
     { 
      using (IDbCommand cmd = _dbConnection.CreateCommand()) 
      { 
       cmd.CommandText = TableOneSql.FindAllSql(); 

       return _tableOneRowMapper.GetObjectList(cmd.ExecuteReader()); 
      } 
     } 
     catch (Exception exception) 
     { 
      _log.Error(exception.Message, exception); 

      throw; 
     } 
    } 

    private readonly IDbConnection _dbConnection; 
    private readonly TableOneRowMapper_tableOneRowMapper; 
    private readonly ILog _log; 
} 

_tableOneRowMapper.GetObjectList(cmd.ExecuteReader())從數據庫中獲取數據,並將其映射到一個列表。我們已經有了過去的記錄問題,導致映射問題,現在想立即記錄這些記錄,然後將它們放到調用應用程序中。除了異常處理之外,我還測試了一切。我必須保持一般的異常處理。

我使用或有以下可使用:

  • 的.Net 3.5
  • NUnit的2.5.10.11092
  • 犀牛嘲笑3.6

VS MY問題:

  • 如何爲 異常處理創建自動化測試(單元或集成)?
  • 我是否需要注入TableOneRowMapper和 模擬它,所以它調用時會引發異常?
  • 有沒有其他的 方法來做到這一點,而不注入它?
  • 我不擔心測試異常處理嗎?

回答

3

?我如何爲異常處理創建自動化測試(單元或集成)?

// ensure that a given code block throws specific exception 
Assert.Throws<ExceptionType>(() => { code block to execute }); 

// ensure that a given code block DOES NOT throw specific exception 
Assert.DoesNotThrow(() => { code block to execute }); 

?我是否需要注入TableOneRowMapper並模擬它,以便在調用時引發異常?

  • Unti測試 - 是的,因爲它是一個依賴,你應該把它注射
  • 集成測試 - 無

?有沒有其他方法可以在不注入的情況下做到這一點?

沒有,否則這將是一個集成測試,而單元測試

?我不擔心測試異常處理嗎?

???

+0

謝謝。我想我知道答案。猜猜我需要構造。 –

1

•如何爲異常處理創建自動化測試(單元或集成)?

NUnit具有ExpectedException屬性(http://www.nunit.org/index.php?p=exception & r = 2.4),它驗證是否引發了異常。

您還需要驗證是否記錄了異常。 LogFacade.GetLog()可以返回一個模擬日誌嗎?

•是否有其他方法可以在不注入的情況下執行此操作?

這取決於您的定義'注入'

在注射的一般意義上 - 使用非類中創建的東西 - 你需要注入映射器,否則,就像@sll所說的那樣,它不是單元測試。

如果您擔心更改TableOneDAO的ctor,則可以使用工廠創建映射器,而不是在DAO內創建映射器。在您的測試中,您可以在工廠註冊模擬映射器。

其他

如果你想這是做了很多(創建和測試大量的表的DAO的)我想創建一個基類TableDAO和它所帶來的一切人。派生類只需要提供mapper和sql字符串。

這樣做,異常處理只需要單元測試一次;爲基類。

hth,

Alan。

+0

創建基類TableDAO類的好評,因此只需要測試一次異常處理。 –