asp.net-mvc - 如何使用 Rhino Mocks 模拟 HttpContext.Application

标签 asp.net-mvc rhino-mocks httpcontext

我是 Mocking 框架的新手,并且已经开始使用 RhinoMocks 来协助我的 MVC 应用程序单元测试。

我正在使用 Scott Hanselmanns MVC Mock Helper协助模拟 HttpContext。
我已经成功地(一段时间后) mock 了我需要的一些东西,但是当涉及到 HttpContext 的 Application 属性时,我就陷入了困境。

在我的应用程序中,我在应用程序中存储一个对象并在 Controller 中检索它,例如:

SomeObj foo = (SomeObj)Application["fooKey"];

这是在我的 MVC 应用程序中的 Application_Start 上创建的。

按照第一个回答更新 (为清楚起见,附加代码)
目前在测试设置中我做:
HttpContextBase mockHttpBase = mocks.FakeHttpContext();
controllerToTest = new SomeController();
mocks.SetFakeControllerContext(controllerToTest);


HttpApplicationStateBase appState = 
    MockRepository.GenerateStub<HttpApplicationStateBase>();

Globals tmpAppGlobals = 
    new Globals();

mockHttpBase.Expect(ctx => ctx.Application).Return(appState);
mockHttpBase.Expect(ctx => ctx.Application[Globals.GlobalsKey]).
    Return(tmpAppGlobals);

在我的单元测试设置中,我这样做:
Globals tmpAppGlobals = new Globals();
controllerToTest.ControllerContext.HttpContext.
            Expect(ctx => ctx.Application[Globals.GlobalsKey]).
Return(tmpAppGlobals);

此调用为 Application 对象引发 NullReference 异常。

我的问题有两个:

1)这是正确的方法还是我从设计/架构的角度做错了什么?

2)为什么这不起作用?!

提前致谢。

最佳答案

无需深入研究,这看起来基本正确。

Application 属性在 HttpContextBase 上是虚拟的,因此您应该能够从 Rhino 为它设置一个返回值——假设您像 Scott Hanselmanns 的帖子那样模拟 HttpContextBase。

一些可能的原因,实际上只是缺乏信息的猜测:

  • 您是否设置了退货
    controllerToTest.ControllerContext?
  • 您是否为此设置了退货
    对象 HttpContext 属性?
  • 您是否为此设置了退货
    对象应用程序属性?

  • 我问的原因是,通常当您进行期望设置时,您已经拥有对将作为测试的一部分调用的对象的引用,因此您不会像处理 controllerToTest.ControllerContext.HttpContext. Expect() 那样执行属性链。称呼。

    编辑:

    我想我看到了问题,我认为这部分是:
    Expect(ctx => ctx.Application[Globals.GlobalsKey])
    我认为您假设索引器的工作方式与属性相同,但实际上并非如此。您真正需要做的是对您的 appState 设置一个期望值。对象来接收对 Item 属性的调用,如下所示:
    // setup expectations -- assumes some of the expectations and mocks 
    // the from original question
    mockHttpBase.Expect(ctx => ctx.Application).Return(appState);
    appState.Expect(ctx => ctx.Item(Globals.GlobalsKey)).Return(tmpAppGlobals);
    
    // run the test
    

    关于asp.net-mvc - 如何使用 Rhino Mocks 模拟 HttpContext.Application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/705833/

    相关文章:

    c# - ASP.Net MVC 如何用浏览器中无法解析的内容替换 HTML 标签

    asp.net-mvc - ASP .NET MVC正确的UserControl体系结构

    silverlight - Silverlight 的 Rhino Mocks 丢失

    unit-testing - RhinoMocks - 使用非静态存储库时无法将类型 foo 转换为类型 bar

    rhino-mocks - 我可以让Rhino MocksGenerateStub或GenerateMock每次都返回一个新类型吗?

    http - 如何在 golang 中获取 http 请求的初始时间戳?

    javascript - "Add item"用于绑定(bind)到集合的表单的 JavaScript 按钮——MVC3 中的情况是否更好?

    asp.net - 有关将 .NET Windows 窗体应用程序迁移到 Web 应用程序的指南

    asp.net - SP2010 - httpcontext.response.write() 不适用于 LinkBut​​ton 的 onClick 事件

    asp.net-mvc - 在 HttpContext.Current.Items 与 ViewData 中存储数据