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

Jul*_*les 5 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;

        }
Run Code Online (Sandbox Code Playgroud)

我认为为了测试控制器,我首先模拟了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");
         }
Run Code Online (Sandbox Code Playgroud)

构建但是nunit在运行测试时返回以下错误

System.NotSupportedException:类型为mock必须是接口或抽象或非密封类.

谢谢你的帮助.

Pau*_*ich 2

让您的会话在构造函数中采用 HttpContextBase 并将其用作属性的类型。您仍然应该能够在生产代码中将具体的 HttpContext 传递给会话。

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

        public SessionService(HttpContextBase context) 
        { 
            this.Context = context; 
        } 
} 
Run Code Online (Sandbox Code Playgroud)

然后通过将“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");    
         } 
Run Code Online (Sandbox Code Playgroud)

  • 这并没有立即起作用,因为我收到一条错误,指出“无法为接口模拟传递构造函数参数”。但我只是删除了 mockhttpcontext 参数,测试工作正常。模拟接口实际上不需要构造函数参数,这是有意义的。 (2认同)