无法设置会话变量

本文关键字:变量 会话 设置 | 更新日期: 2023-09-27 18:03:29

我尝试设置会话变量以运行某些单元测试失败。当我尝试设置会话变量时,我不断收到"System.NullReferenceException:对象引用未设置为对象的实例"的错误。

这是我正在构建的测试:

[TestMethod]
public void MyMethod()
{
  //Arrange
  int id = 12345;
  string action = "A";
  string comment = "";
  string user = "user";
  var controller = new MyController();
  //Act
  controller.Session["altUser"] = user;
  var result = controller.Process(id, action, comment);
  //Assert
  Assert.IsNotNull(result);     
}

这是我的控制器:

[Authorize]
public class MyController : Controller
{
  public ActionResult Process(int id, string action, string comment)
  {
    string userId = Session["altUser"].ToString();
    //some other stuff that evaluates ID, Action, and Comment
  }
}

但是,当我运行应用程序本身时,没有错误,应用程序正常运行。我确实理解,通过测试驱动开发,测试应该为实现铺平道路。我正在尝试对已经完成的应用程序进行一些单元测试练习。如果可能的话,由于应用程序可以工作,我想避免对我的实现进行任何更改,而只是编写一个单元测试来支持我已经知道的内容。

无法设置会话变量

控制器从 HttpContext 获取会话,这在您的单元测试中不存在,这就是它失败的原因。

但是,您可以模拟HttpContext并在那里放置模拟会话。

这样的东西可能会起作用(使用最小起订量作为模拟框架(

    var mockControllerContext = new Mock<ControllerContext>();
    var mockSession = new Mock<HttpSessionStateBase>();
    mockSession.SetupGet(s => s["altUser"]).Returns("user");
    mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
    var controller = new MyController();
    controller.ControllerContext = mockControllerContext.Object;

显然需要用你真正想要得到的细节来填充模拟对象。

您还可以从HttpSessionStateBaseHttpContextBase派生自己的类,并使用它们而不是实际会话。

没有勺子,呃,会话 — 执行单元测试时,ASP.NET runtine既没有初始化也没有运行。应分解代码外部的任何Session依赖项,并使单元测试所需的类和方法独立于 ASP。NET 的运行时功能。

当你运行单元测试时,你不是通过Web服务器运行程序,因此无法访问任何HttpContext或 ASP.NET 会话,而当你在VS中通过调试运行程序时,你使用的是内置的Visual Studio Web服务器,它使程序能够使用会话。

这是一篇文章,将引导您完成 ASP.NET 会话及其工作原理。