2017-08-14 27 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(); 
    } 

iは、ユニットテストを実行することができています。 しかし、私が(手動でアクションをテストする)メソッドを参照すると、オブジェクト参照が設定されていません。オブジェクトは空です。この問題を解決するには?

また、私は多くの場所で、私は今のところインターフェイスに基づいて呼び出しを変更したくないそれらの場所で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()は、オブジェクト参照を設定していないエラーを与える関数呼び出しを使用しています。 (もし私がプロジェクトを実行していない場合、-not unit test)。基本的に私は、モックインターフェイスを渡すことによってユニットテストからコントローラクラスを呼び出します。それはうまく動作しています。もし私が何をすべきかコントローラクラスメソッドを呼びたいと思う。お知らせ下さい!! – Antony

+0

https://kakimotonline.com/2011/02/13/tdd-in-asp-net-mvc-applications-with-moq-framework/これは私がMockingした方法です。しかし問題は、私のメニューがProductController/Listにルーティングされることです。無効なコンストラクタパラメータが原因で失敗しています。だから、私は任意のパラメータなしで追加のデフォルトのコンストラクタを提供する必要がありますか?私はそれを行う場合、私はオブジェクトの参照エラーを取得しています。お知らせ下さい – Antony

関連する問題