将模拟参数传递给模拟接口
问题描述:
我正在使用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以下错误:类型嘲笑必须是一个接口或抽象的或不密封类。
感谢您的帮助。
答
让会话在构造函数中使用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
直视'HttpContextBase' –
如果你真的需要模拟任何密封类与自定义的行为,看看微软的痣项目。 –