传递模拟参数给模拟接口

5

我正在使用nuit和moq来测试我的控制器。

我使用一个带有接口的session类,并使用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:要模拟的类型必须是接口、抽象类或非密封类。

感谢所有的帮助。


如果您确实需要使用自定义行为模拟任何密封类,请查看微软的Moles项目。 - np-hard
1个回答

2

在构造函数中使用HttpContextBase作为属性的类型来处理会话。在生产代码中,仍然可以将具体的HttpContext传递给会话。

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

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

然后,通过将“mockHttpContext.Object”传递给会话构造函数并模拟HttpContextBase来修复您的单元测试。请注意保留HTML标签。
 [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");    
         } 

2
这个一开始没能直接运行成功,因为我收到了一个错误提示:“无法为接口模拟传递构造函数参数。”但是我只是简单地移除了mockhttpcontext参数,测试就正常工作了。被模拟的接口实际上并不需要构造函数参数,这有点合理。 - Jules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接