我正在使用带有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必须是接口或抽象或非密封类。
感谢您的帮助。
答案 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");
}