MVC3 中的单元测试控制器会话变量
我正在对我的控制器进行单元测试。
在我的控制器方法之一中,我设置会话变量:
public void Index(){
Session["foo"] = "bar";
return View();
}
如何对其进行单元测试?问题是测试时Session属性为null。注入是不可能的,因为 Session 属性是只读的。
[TestMethod]
public void TestIndex()
// When
_controller.Index();
// Then
Assert.AreEqual("bar", _controller.Session["foo"])
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
就我个人而言,我喜欢使用 MvcContrib TestHelper 来模拟所有 HTTP 管道:
Personally I like using the MvcContrib TestHelper which mocks all the HTTP pipeline:
这就是我用于单元测试友好的会话缓存的方法。通过检查 HttpContext.Current 是否为 null,您就可以通过 nunit 测试的缓存,并且仍然允许您的程序正常运行。
这是最简单的解决方案,无需在项目中进行大量代码更改。
This is what I used for Unit Test friendly Session Caching. By checking HttpContext.Current for null, you're by passing the caching for nunit tests and still allow your program to function normally.
This is the simplest solution without making a lot of code changes in your project.
我总是建议将会话对象包装在另一个对象中。这不仅为您提供了更简单的测试方法,而且还使所有对会话类型的访问都变得安全。很容易在一个地方的一个地方输入错误的会话密钥名称,然后花费数小时寻找错误。
该对象将具有以下字段:
一旦您进行测试,您可以使用仅保留测试状态的虚拟对象来模拟会话类。
我通常处理这个问题的方法是使用依赖注入。如何设置它是一个漫长的研究。这是一种方法的链接
http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx
I always recommend wrapping the session object in another object. This not only gives you an easier way to test, but also makes all access to the session type safe. It is very easy to mistype a session key name in one spot in one place and then hunt for the bug for hours.
The object would have fields as
Once you are testing you can mock the session class with a dummy that only keeps state for the test.
The way I usually handle this is with dependency injection. How to set this up is a long examination. Here is a link to one way
http://weblogs.asp.net/shijuvarghese/archive/2011/01/21/dependency-injection-in-asp-net-mvc-3-using-dependencyresolver-and-controlleractivator.aspx