我使用MVC3并希望通过Microsoft.VisualStudio.TestTools.UnitTesting
和Moq
测试以下操作:
public ActionResult index()
{
Session.Add("username", "Simon");
var lName = Session["username"] as String;
var lSessionID = Session.SessionID;
return Content(lSessionID);
}
我的单元测试:
[TestMethod]
public void IndexTest()
{
// Arrange
var contextMock = new Mock<ControllerContext>();
var mockHttpContext = new Mock<HttpContextBase>();
var session = new Mock<HttpSessionStateBase>();
mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object);
StartController controller = new StartController();
var lResult = controller.index() as ContentResult;
Assert......;
}
我的单元测试导致NullReferenceException:
我还尝试MvcContrib.TestHelper
失败了Session.SessionID
,但消息“尚未实现”。
如何使用单元测试来测试我的动作?
答案 0 :(得分:9)
您的模拟设置不完整。
您需要设置ControllerContextc.HttpContext
以返回mockHttpContext
,并且还需要使用contextMock
中的StartController
设置其ControllerContext
媒体资源:
因此,以下设置应该有效:
var contextMock = new Mock<ControllerContext>();
var mockHttpContext = new Mock<HttpContextBase>();
var session = new Mock<HttpSessionStateBase>();
mockHttpContext.Setup(ctx => ctx.Session).Returns(session.Object);
contextMock.Setup(ctx => ctx.HttpContext).Returns(mockHttpContext.Object);
StartController controller = new StartController();
controller.ControllerContext = contextMock.Object;