2011-12-01 37 views
5

我正在使用moq測試我的控制器。將模擬參數傳遞給模擬接口

我使用一個會話類,它有一個接口,並使用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的所述construtor。 我有這到目前爲止

[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"); 
     } 

它建立但NUnit的返回時在測試運行

System.NotSupportedException以下錯誤:類型嘲笑必須是一個接口或抽象的或不密封類。

感謝您的幫助。

+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參數,測試工作正常。嘲諷的界面實際上並不需要構造器參數,這是有道理的。 – Jules