【问题标题】:RhinoMocks fails when stubbing the same object twice?RhinoMocks 在两次存根同一对象时失败?
【发布时间】:2016-09-27 12:16:49
【问题描述】:

我认为代码将比我糟糕的标题更好地解释这个问题。

_httpContextBaseHttpContextBase,但我认为这并不重要。 _httpCookiecollection 只是一个HttpCookieCollection

//Works fine
_httpContextBase.Stub(c => c.Response.Cookies).Return(_httpCookieCollection);

//Fails after attempting to stub the second line. "Object reference not set to an instance of an object". First line passes fine.
_httpContextBase.Stub(c => c.Response.Cookies).Return(_httpCookieCollection);
_httpContextBase.Stub(c => c.Request.Cookies).Return(_httpCookieCollection);

//Work around
var responseBaseMock = MockRepository.GenerateMock<HttpResponseBase>();
responseBaseMock.Stub(r => r.Cookies).Return(_httpCookieCollection);
_httpContextBase.Stub(c => c.Response).Return(responseBaseMock);

var requestBaseMock = MockRepository.GenerateMock<HttpRequestBase>();
requestBaseMock.Stub(r => r.Cookies).Return(_httpCookieCollection);
_httpContextBase.Stub(c => c.Request).Return(requestBaseMock);

想象一下上面的测试都是他们自己的方法。每条注释都解释了当它下面的代码运行时会发生什么。

第一项有效,第二项失败,第三项是我的解决方法。我想知道的是为什么第二项失败,因为我似乎无法弄清楚。


第 2 项的堆栈跟踪(即使第 1 行和第 2 行倒置,堆栈跟踪也相同)
System.NullReferenceException : Object reference not set to an instance of an object.
   at Api.Tests.Client.CookieTests.<>c.<Test>b__12_1(HttpContextBase c) in Api.Tests\Client\CookieTests.cs:line 113
   at Rhino.Mocks.RhinoMocksExtensions.Expect[T,R](T mock, Function`2 action)
   at Rhino.Mocks.RhinoMocksExtensions.Stub[T,R](T mock, Function`2 action)
   at .Api.Tests.Client.CookieTests.Test() in .Api.Tests\Client\CookieTests.cs:line 113

【问题讨论】:

  • 我在这个问题中没有看到 Windsor 的任何用途,但也许是 RhinoMocks,您是否错误地为您的问题命名和标记?包含异常的堆栈跟踪也是一个好主意。
  • @JonathonRossi 哦...我确实做到了。谢谢乔纳森!

标签: c# mocking rhino-mocks


【解决方案1】:

我知道我参加聚会有点晚了,这对提问者来说可能不再重要,但我仍然会为任何刚接触 Rhino Mocks 的人回答。

在使用 Rhino Mocks 进行模拟时,如果多次调用该方法,则需要将 .Repeat.Once() 附加到每个不同的存根上。 (.Once()) 可以替换为在使用 .Twice().Times(x) 获得新响应之前您需要使用该响应的适当次数,其中 x 替换为您需要的次数的数值拨打电话。

【讨论】:

    【解决方案2】:

    我没有试过你的代码,所以我可能不对。但可能是 _httpContextBase.Request 为空。如果是这种情况,以及 NullReferenceException 的原因,那么看起来 _httpContextBase.Response 不为 null,因为它没有同样的问题。

    我不知道您的测试中是否设置了该对象,但这可能需要查看。另外,您是否以相反的方式尝试过它们?我猜这与.Request有关,而不是第二个存根。

    我知道你没有要求它,但我也会建议一种不同的方法,我发现它对模拟 HttpContext 等复杂事物很有用。编写一个抽象接口,公开您要使用的部分(例如 ResponseCookies 和 RequestCookies)。您对该接口的实现可以直接使用 HttpContext 成员,但您的其他类不再依赖,并且您有一个非常简单的接口来模拟或存根。

    【讨论】:

    • 嗨罗宾,感谢您的回复。 Response 和 Request 都是独立工作的。就像我要采用第一个“正常工作”项目并将响应更改为请求一样,这会很好。如果我交换第 2 项中的行,那么它仍然会在第二行崩溃。不过,您对最后一部分的想法建议很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多