2016-03-01 85 views
-2

我有一個asp.net web服務服務層[WebMethod] s。這些Web方法有連接字符串並正在修改dev db。沒有單獨的數據訪問層。 WebMethods通過存儲過程修改數據庫。我想用nunit單元測試這些web方法。但無法找到一種不修改數據庫的方式。我願意修改我的服務層,以完全分離數據訪問層,然後對其進行單元測試。任何導致良好的做法做這些事情將不勝感激。單元測試asp.net web服務web方法直接連接到數據庫

更新: 我的web服務正在被一個已建立的產品使用,使得在分離DAL之後很難執行構造函數依賴注入。

+0

將你的數據訪問抽象成一個從接口繼承的存儲庫。然後,您可以使用該界面創建可測試的模擬回購,但不會觸及您的實際數據庫。 –

回答

0

解決方案直接存在於單元測試中。您創建了一個實現接口的數據訪問層,並且您使用依賴注入來在運行場景中使用真實代碼,併爲測試場景使用模擬服務。

您要測試的代碼,需要從上面的代碼和下面的代碼中分離出來。然後,對於每個場景或方法,您準備一個測試,它將驗證在此測試案例中,對於預期的輸入數據,您將獲得預期的輸出數據。

+0

我已經有一個使用Web服務的已建立的圖層。如果我創建一個實現接口並使用依賴注入的DAL,我將不得不更改服務類的構造函數以使用它。這樣我可以在從測試類調用時模擬接口。如果我錯了,我很抱歉,因爲我對編程世界很陌生。 –

+0

我會建議使用靜態服務定位器,或者在這種情況下使用數據訪問定位器。 Di在此定位器中處理,並且您始終使用靜態資源。如果您使用泛型創建一個通用定位器,則可以將其重複用於多個模擬場景。 – user853710

+0

當你想要一個ServiceMock的時候,你可以從定位器中獲得它,如果你需要真正的服務,它也是一樣。與DAL一樣。重要的是你總是使用兩個版本都會實現的接口。泛型會很好地處理這個問題 – user853710

0

你一定要改變你的DAL來單元測試這個。你的單元測試不應該觸及數據庫,你應該創建一個存儲庫或其他抽象,你可以在你的測試中模擬。

+0

如果我創建一個實現接口並使用依賴注入的DAL,我將不得不更改服務類的構造函數以使用它。這樣我可以在從測試類調用時模擬接口。如果我錯了,我很抱歉,因爲我對編程世界很陌生。 –

+0

是的,這聽起來正確。無論如何,您需要一些將服務的接口作爲構造函數的依賴項的類。然後,您可以在測試中模擬服務依賴關係,並測試其周圍的所有其他代碼。 – andreasnico

+0

我已經有一個使用Web服務的已建立圖層。如果我更改構造函數以將接口作爲參數,我將如何使用Web服務。我需要更改服務正在使用的代碼? –

0

所以有兩種類型的測試我認爲你可能會感到困惑。單元測試只是您可以測試的特定功能,不應該依賴外部系統。您可以執行集成測試,因爲Web服務與此數據庫緊密耦合。這將需要重構數據庫功能並嘲笑對它的調用,以便能夠正確地測試服務。一旦你這樣做了,MSDN就如何正確地單元測試一個Web服務已經有了一些步驟:https://msdn.microsoft.com/en-us/library/ms243399(v=vs.100).aspx