我正在使用shanselmann's MvcMockHelper类使用Moq模拟一些HttpContext的东西,但我遇到的问题是能够在我的MVC控制器中为我的模拟会话对象分配一些内容然后能够在我的单元测试中读取相同的值以进行验证 .
我的问题是如何将存储集合分配给模拟的会话对象,以允许诸如session [“UserName”] =“foo”之类的代码保留“foo”值并使其在单元测试中可用 .
我正在使用shanselmann's MvcMockHelper类使用Moq模拟一些HttpContext的东西,但我遇到的问题是能够在我的MVC控制器中为我的模拟会话对象分配一些内容然后能够在我的单元测试中读取相同的值以进行验证 .
我的问题是如何将存储集合分配给模拟的会话对象,以允许诸如session [“UserName”] =“foo”之类的代码保留“foo”值并使其在单元测试中可用 .
6 回答
我从Scott Hanselman的MVCMockHelper开始,添加了一个小类并进行了如下所示的修改,以允许控制器正常使用Session和单元测试来验证控制器设置的值 .
它并不完美,但它足以进行测试 .
在这里使用Moq 3.0.308.2是我的单元测试中的帐户控制器设置示例:
然后在你的控制器方法中,以下内容应返回“Hello World”
我做了一个比@RonnBlack发布的答案稍微复杂一点的模拟
我刚刚找到了一个很好的例子,说明Oxite团队如何伪造他们的HttpSessionState并在该伪造内部维护一个SessionStateItemCollection集合 . 在我的情况下,这应该和moq一样好用 .
编辑:
此示例的URL为http://oxite.codeplex.com/sourcecontrol/changeset/view/33871?projectName=oxite#388065
我认为你可以在模拟上设置一个期望值,它具有一个特定的值,它应该返回任何值 . 模拟不是用作实际的假货,而是可以断言行为的东西 .
听起来你实际上正在寻找一个可以绕过会话的适配器,你可以在测试期间提供不同的实现,在运行时它会返回HttpContext会话项吗?
这有意义吗?
谢谢@RonnBlack的解决方案!在我的情况下,我一直得到这个异常,因为Session.SessionID为null:
为了解决这个问题,我使用Moq
Mock<HttpSessionStateBase>
而不是他的MockHttpSession来实现@ RonnBlack的代码:详情请见http://weblogs.asp.net/gunnarpeipman/using-moq-to-mock-asp-net-mvc-httpcontextbase