当我从单元测试调用时,会话在控制器中不起作用

时间:2014-11-20 16:28:59

标签: asp.net-mvc unit-testing

我有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打电话时如何在控制器中进行会话?

2 个答案:

答案 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);