c# - 无法设置 session 变量

标签 c# asp.net-mvc unit-testing

我在尝试设置 session 变量以运行某些单元测试时没有成功。当我尝试设置我的 session 变量时,我不断收到“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);     
}

这是我的 Controller :

[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
  }
}

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

最佳答案

Controller 从 HttpContext 获取 session ,它在您的单元测试中不存在,这就是它失败的原因。

但是,您可以模拟一个 HttpContext 并在其中放置一个模拟 session 。

这样的事情可能会起作用(使用 moq 作为 Mocking 框架)

    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 派生您自己的类,并使用它们代替真正的 session 。

关于c# - 无法设置 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349347/

相关文章:

asp.net-mvc - 如何在MVC 5Application中实现OWIN和Katana

java - 如何对返回 Java 字符串的方法进行单元测试?

delphi - Delphi XE Starter Edition 使用什么测试框架/单元测试

c# - 在多个 linqWhere 子句中使用相同的查找值,而无需多次查找

c# - 嵌套/子对象的自定义 XmlSerialization

asp.net-mvc - 如何向客户推荐 Asp.Net Mvc 而不是其他技术?

asp.net-mvc - 对ASP.NET MVC应用程序使用.resx本地化有什么优势?

c# - 计算给定长度的所有可能子序列 (C#)

c# - 字符串 HTML 中的双引号

java - 在 Android 代码中模拟创建 AsyncTasks 和 Intents 的优雅方法