2011-12-01 93 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