2017-08-14 170 views
1

我是單元測試新手。嘗試整合遺留代碼的單元測試。 要moq類的相同的方法,我需要注入接口或有任何其他選項。單元測試C#MOQ依賴注入

如果向構造函數的接口注入是唯一的方法,那麼如何定義現有代碼的默認構造函數。 實施例:

private IController _iController; 
    public Controller(IController iController) 
    { 
     _iController= iController; 

    } 
    public ActionResult ActualMethod() 
    { 
     _iController.FillViewBag(); 
     return View(); 
    } 
    public void UnitTest() 
    { 
     var i = new Mock<IController>(); 
     i.Setup(d => d.FillViewBag()); 
     var controller = new Controller(i.Object); 
     controller.ActualMethod(); 
    } 

對於上述代碼我能夠進行單元測試。 但是,如果我瀏覽的方法(手動測試行動)它是失敗的對象ref沒有設置。因爲對象是空的。如何解決這個問題?

另外我在很多地方使用FillViewBag,那些地方我現在不想改變基於接口的調用。請指教。

回答

2

您嘲笑IController接口,然後將模擬對象傳遞給您的構造函數。

var mockController = new Mock<IController>(); 

var controller = new Controller(mockController.Object); 

你還需要設置你想要的嘲笑FillViewBag做什麼:信息的這個

var mockController.Setup(c => c.FillViewBag).Callback(() => do something here); 

大量的起訂量Quickstart

+0

非常感謝您的答覆。我已經提到了我的問題中的相同內容。我在模擬中沒有任何問題。但在應用程序中,我正在使用函數調用_interface.FillViewBag()這是給對象引用沒有設置錯誤。 (如果我運行該項目 - 不單位測試)。基本上我會通過傳遞模擬接口來從單元測試中調用控制器類。這工作正常。如果我想調用控制器類的方法應該做什麼。請指教!! – Antony

+0

https://kakimotonline.com/2011/02/13/tdd-in-asp-net-mvc-applications-with-moq-framework/這是我如何做嘲笑。但問題是,我的菜單路由到ProductController/List。在調用它時由於構造器參數無效而失敗。那麼我是否需要提供額外的默認構造函數而沒有任何參數?如果我這樣做,我正在獲取對象引用錯誤。請指教 – Antony