将模拟参数传递给模拟接口

时间:2011-12-01 14:54:51

标签: c# asp.net-mvc nunit moq

我正在使用带有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的构造器。 到目前为止我有这个

 [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:类型为mock必须是接口或抽象或非密封类。

感谢您的帮助。

1 个答案:

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