2016-03-10 24 views
0

我正在實現一個接口到一個C#類,其整個工作基本上只是調用一些T-SQL存儲過程並返回數據。接口的其他實現可以通過Web服務獲取數據,讀取文件等,以便測試這個特定的類,我最好模擬一個SQL Server數據庫及其過程。模擬對SQL Server存儲過程的調用?

我不確定這是否可行。我見過像RhinoMock這樣的工具用於模擬數據庫,但由於我的代碼的全部目的是與數據庫交談,我可以模擬整個數據庫還是浪費時間?理想情況下,我希望能夠透明地提供替代方案,以便擁有真實的數據庫,以便進行本地測試,從而實現真正的存儲過程對虛假數據庫的調用。

+0

你確定@inquisitive_mind?這將是理想的,但:http://stackoverflow.com/questions/3335162/creating-stored-procedure-and-sqlite –

+0

@montewhizdoh你可能是對的! –

+0

我認爲這一切都取決於。你真的不想寫單元測試,最終結束測試代碼而不是你寫的東西。測試一下連接的工作方式是否屬於「我測試SQL Server,還是測試我的代碼?」這個灰色區域?和「我使用正確的連接字符串嗎?」。最好問:存在哪些代碼路徑,從存儲過程傳入​​和傳出?測試是否與功能用例並存?如果你是TDD,你希望與功能用例密切配合 - 那時,一切都將開始良好吻合。 – code4life

回答

0

如果你正在構建單元測試,那麼你不應該執行存儲過程,你應該存根這個接口。

如果您正在構建集成測試,那麼您必須擁有一切工作。

在這兩種情況下,你的類都不應該直接這樣做,你應該有一個像IDbHandler這樣的內部處理程序,在你的單元測試期間你應該嘲笑它,在整合測試期間你應該使用具體的實現。

有一個模擬的目的是驗證另一方(你的案例中的DB)獲得了預期參數的請求,但物理組件不能被模擬,只需在代碼和物理組件將啓用這些驗證。

順便說一句,我將開始進行單元測試,然後添加集成測試。

+0

換句話說,你不會單元測試你創建的類來實現你介紹的接口抽象存儲過程。 – Maarten

+1

我不確定這裏的單元測試的價值。如果這個類只是調用sprocs,你只是想確保sproc名字和命名參數都與數據庫中的內容匹配。看起來這是測試這個具體類的主要價值。 –