2009-10-05 53 views
3

我有一個基礎控制器,我可以輕鬆地將數據傳遞到母版頁視圖。然而,這個基礎控制器得到一個服務層傳遞給它,每當我運行我的單元測試時,這個服務層就會殺死它,因爲它試圖訪問一些數據庫的東西。如何在asp.net mvc中模擬基礎控制器?

private ServiceLayer service; 

     public ApplicationController():this(new ServiceLayer()) 
     { 
     } 

     public PlannerApplicationController(IServiceLayer serviceS) 
     { 
      service= serviceS;   
     } 

     protected override void Initialize(RequestContext requestContext) 
     { 

      base.Initialize(requestContext); 
      // some stuff gets called here. 
     } 

第一件事就是服務層調用

public ServiceLayer() 
      : this(new Repository()) 
     { 

     } 

//具有另一個構造爲DI。

因此,當我運行我的測試,並轉到我的控制器,它繼承這個基本控制器,一旦它擊中我的控制器構造函數,它似乎調用此基本控制器。

所以在我的單元測試,我試圖做這樣的事情

baseController =新的ApplicationController(SerivceLayerInterface)來模仿主控制器;

我使用moq和東西來模擬serviceLayer接口中的存儲庫,但它似乎沒有效果。

所以不知道該怎麼做。

回答

3

而不是嘲笑你的基礎控制器,爲什麼你不嘲笑服務層接口。例如,使用最小起訂量,你可以這樣做:

var serviceMock = new Mock<IServiceLayer>(); 
//serviceMock.Setup(s => s.SomeMethodCall()).Returns(someObject); 
var controller = new BaseController(serviceMock.Object); 

總的想法是,如果你測試你的控制器,你要嘲笑它的依賴。你想避免嘲笑你正在測試的東西。

+0

嗯。看到這是我一直在想我應該單獨測試服務層?或者與控制器層一起使用?我之所以說這是很多我的服務層的東西,其中有驗證方法。所以我認爲不妨通過視圖發送驗證數據,然後測試最後的模型狀態。因爲大多數視圖的東西只是將值傳遞給服務層,然後有幾個if語句來檢查驗證是否成功,並根據服務層的結果返回正確的視圖。 – chobo2 2009-10-05 05:43:33

+0

另外我發現的是我必須做很多嘲笑。有人告訴我,如果你嘲笑你做錯了什麼。然而,我不明白如何嘲笑它。就像幾乎每個方法都從數據庫調用某個方法一樣,或者使用一些內置的asp.net成員函數(如User.Identity ...),如果不嘲笑它,似乎就會死掉。所以我只是不明白這是怎麼回事。 – chobo2 2009-10-05 05:44:59

相關問題