2011-12-01 8 views
5

moqでnuitを使用してコントローラをテストしています。モックされたパラメータを模擬インターフェイスに渡す

インターフェイスを持つセッションクラスを使用し、ninjectを使用してコンストラクタにHttpContextを注入します。

このよう
 public class SessionService : ISession 
     { 
      public HttpContext Context { get; set; } 

      public SessionService(HttpContext context) 
      { 
       this.Context = context; 
      } 
    } 


     public interface ISession 
     { 
      HttpContext Context { get; set; } 
    } 



    public HomeController(ISession session) 
     { 
      _session = session; 

     } 

私は最初のHttpContextを模擬した後嘲笑ISessionのコンストラクタにそのオブジェクトを渡したコントローラをテストするために考えます。 私はこれを持って、これまでにNUnitのテストが

System.NotSupportedException実行される次のエラー返しますが、ビルドし

[Test] 
public void index_returns_view() 
     { 
      //arrange 
      var mockHttpContext = new Mock<HttpContext>(); 
      var mockContext = new Mock<ISession>(mockHttpContext); 
      var c = new HomeController(mockContext.Object); 
      //act 
      var v = c.Index() as ViewResult; 
      //assert 
      Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect"); 
     } 

:インタフェースまたは抽象または非密封されたクラスでなければならない模擬するタイプ。

ありがとうございました。

+0

は 'HttpContextBase' –

+0

に見えます。 –

答えて

2

セッションでコンストラクタ内のHttpContextBaseを取得し、そのプロパティの型として使用します。 プロダクションコードでセッションの具体的なHttpContextを引き渡すことができるはずです。

public class SessionService : ISession 
    { 
     public HttpContextBase Context { get; set; } 

     public SessionService(HttpContextBase context) 
     { 
      this.Context = context; 
     } 
} 

そして、セッションのコンストラクタに「mockHttpContext.Object」を渡すことによって、それがHttpContextBaseを皮肉っていることを、あなたのユニットテストを修正。あなたが本当にマイクロソフトのモルプロジェクトを見て、自分のカスタム動作で任意の密閉されたクラスをモックする必要がある場合

[Test]  
public void index_returns_view()  
     {  
      //arrange  
      var mockHttpContext = new Mock<HttpContextBase>();  
      var mockContext = new Mock<ISession>(mockHttpContext.Object);  
      var c = new HomeController(mockContext.Object);  
      //act  
      var v = c.Index() as ViewResult;  
      //assert  
      Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect");  
     } 
+0

これは直ちに動作しませんでした。なぜなら、「コンストラクタの引数はインターフェイスのモックに渡すことができません」というエラーが表示されたからです。しかし、私は単純にmockhttpcontextパラメータを削除し、テストはうまくいきました。模倣されたインターフェースは実際には意味をなさないコンストラクタparamsを実際に必要としません。 – Jules