2010-04-19 42 views
1

我已經創建了SqlCommand的擴展方法,它允許在執行命令之前一些額外的工作:方法測試的擴展方法的SqlCommand

public static SqlDataReader ExecuteMyReader(this SqlCommand sqlCommand) 
{ 
    // Some calculations here 

    return sqlCommand.ExecuteReader(); 
} 

我的問題是什麼是單元測試的最好方式這擴展方法?

我應該直接對數據庫進行測試嗎?

或者我應該嘗試創建一個模擬對象嗎?如果是這種情況,我嘗試通過Moq來做這件事,但由於SqlCommand是一個封閉的類,我似乎無法嘲笑它。

回答

2

你可以將計算拉出到他們自己的方法並單獨測試它們嗎?正如你已經發現的那樣,在這個粒度級別編寫函數的單元測試是很困難和沒有根據的。

+0

這也是一個不錯的選擇。 – Finglas 2010-04-19 13:37:25

+0

我可以把計算拉出來,所以它是在它自己的方法中,但是我寧願這個方法保持私有,是否有測試私有方法的方法? – lancscoder 2010-04-19 13:40:46

+0

@Simon - 查看http://stackoverflow.com/questions/51950/how-do-i-allow-assembly-unit-testing-one-to-access-internal-properties-of-anoth – Finglas 2010-04-19 13:44:13

2

如果你想測試命令實際上是否更新數據庫,你會寫integration test。然後測試這個最好的方法是:

  • 建立一個簡單的數據庫
  • 執行測試
  • 回滾數據庫。
  • 重複

這是好的,因爲這是你關心的內容。如果這是嘲弄(沒有意義),你會測試什麼?你怎麼知道它的工作原理?

您希望嘲笑的唯一時間是使用您的擴展方法的代碼。但是,當你想測試一個擴展方法時,只有一種方法,那就是實際命中數據庫。

+0

您的測試中沒有缺少一步嗎?在測試執行後你看到數據庫處於你想要的狀態的部分? – user151841 2010-04-19 13:36:52

+0

這將作爲第二部分,執行此測試。換句話說,Arrange,Act和Assert。 – Finglas 2010-04-19 13:38:39

0

你說得不對整個方法進行測試是正確的。

我不知道你的計算的性質,但如果它們可以分解到另一個函數,那麼該函數可以進行單元測試。這將有助於確保計算,我認爲這是您的實施的肉,正常工作。