我有ASP.NET MVC项目。现在我正在学习如何使用UnitTesting。为此我创建了UnitTest项目。
我的Testclass中有以下代码:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Controller defaultpage = new Controller();
var result = defaultpage.defaultpage("43", "Y", "Y");
}
}
public ActionResult defaultpage(string uid, string access, string add)
{
Session["uid"] = uid;
Session["access"] = access;
Session["add"] = add;
}
在涉及默认页面控制器方法时,它将对象引用设置为未设置为对象的实例。。
当我从UnitTest打电话时如何在控制器中进行会话?
答案 0 :(得分:1)
你必须模拟会话,因为它没有在单元测试的上下文中定义;
以下是如何使用c#和MOQ
模拟会话的简短摘要http://www.syntaxsuccess.com/viewarticle/how-to-mock-httpcontext
它的基础知识可以用这个块来概括:
Mock<HttpContextBase> httpContext = new Mock<HttpContextBase>();
Mock<HttpSessionStateBase> session = new Mock<HttpSessionStateBase>();
session.Setup(s => s["SomeSessionKey"]).Returns(someObject);
httpContext.Setup(c => c.Session).Returns(session.Object);
另一种选择是使用NSubstitute,它是一个与MOQ非常相似的API的库
答案 1 :(得分:0)
你不能。
您的控制器独立于在运行IIS的托管环境中访问ASP.NET MVC应用程序时存在的HTTP上下文和HTTP管道。
在这种情况下,您需要查看使用Moq
等库来模拟会话然后你就可以创建一个包含会话的HTTP上下文对象的模拟实现(从this tutorial获取的代码示例,我建议你看一下):
// create the mock http context
var fakeHttpContext = new Mock();
// create a mock session object and hook it up to the mock http context
var sessionMock = new HttpSessionMock {{"selectedYear", 2013}, {"selectedMonth", 10}};
var mockSessionState = new Mock();
fakeHttpContext.Setup(ctx => ctx.Session).Returns(sessionMock);
// ... and here's how to attach a http context identity, just in case you'll come to need that, too
var fakeIdentity = new GenericIdentity("mno@ucsj.dk");
var principal = new GenericPrincipal(fakeIdentity, null);
fakeHttpContext.Setup(t => t.User).Returns(principal);
// we'll need to hook our http context up to a controller context mock - because we can't provide our controller with the http context mock directly
var homeControllerMock = new Mock();
homeControllerMock.Setup(foo => foo.HttpContext).Returns(fakeHttpContext.Object);