【问题标题】:passing mocked parameter to mocked interface将模拟参数传递给模拟接口
【发布时间】:2011-12-01 14:54:51
【问题描述】:

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

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

感谢大家的帮助。

【问题讨论】:

  • 如果您真的需要使用您的自定义行为模拟任何密封类,请查看 microsoft 的 moles 项目。

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


【解决方案1】:

让您的会话在构造函数中使用 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");    
         } 

【讨论】:

  • 这并没有立即起作用,因为我收到一条错误消息,指出“无法为接口模拟传递构造函数参数。”但我只是删除了 mockhttpcontext 参数并且测试工作正常。模拟的接口实际上不需要构造函数参数,这是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2022-04-19
  • 1970-01-01
相关资源
最近更新 更多