如何对ASP.NET5/MVC 6 Session进行单元测试?

How to unit test ASP.NET 5 / MVC 6 Session?

我在 class 库中有一个更新会话变量的函数。 ISession 作为参数从控制器传入,因此该函数可以更改会话变量。

我想测试这个函数以确保正确更新会话变量。

然而,首先,我只是想开始使用 XUnit 进行基本单元测试,但我无法让 Session 工作

[Fact]
public void CreateSessionVariable()
{
    var httpContext = new DefaultHttpContext();
    httpContext.Session.SetString("MyVar", "Hi");
    Assert.True(httpContext.Session.Get("MyVar") != null);
}

httpContext.Session.SetString 我收到错误:

Session has not been configured for this application or request

我知道在 MVC6 应用程序中您必须执行 services.AddSession()app.UseSession() 之类的操作,但我不知道如何为单元测试设置它们。

如何配置会话以在单元测试中使用?

Microsoft.AspNet.Session已经测试过了,你可以在这里阅读测试代码https://github.com/aspnet/Session/blob/dev/test/Microsoft.AspNet.Session.Tests/SessionTests.cs
你不必测试它。

使用Moq模拟ISession:

测试project.json

{
  "version": "1.0.0-*",
  "dependencies": {
      "{YourProject under test}": "",
      "xunit": "2.1.0",
      "xunit.runner.dnx": "2.1.0-rc1-*"
    },
  "commands": {
      "test": "xunit.runner.dnx"
  },
  "frameworks": {
    "dnx451": {
      "dependencies": {
        "Moq": "4.2.1312.1622" 
      }
    }
  }
}

测试可以是这样的:

[Fact]
public void CreateSessionVariableTest()
{
    var sessionMock = new Mock<ISession>();
    sessionMock.Setup(s => s.Get("MyVar")).Returns("Hi);

    var classToTest = new ClassToTest(sessionMock.Object);
    classToTest.CreateSessionVariable();
}