RhinoMocks在两次存根相同对象时失败

本文关键字:对象 失败 存根 两次 RhinoMocks | 更新日期: 2023-09-27 18:09:06

我认为代码会比我可怜的标题更好地解释这个问题。

_httpContextBase是一个HttpContextBase,但我认为这无关紧要。_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

RhinoMocks在两次存根相同对象时失败

我知道我来晚了一点,这对问我的人来说可能不再重要了,但我仍然会回答任何一个刚接触Rhino mock的人。

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

我没有试过你的代码,所以我可能不对。但也可能是_httpContextBase。请求为空。如果是这种情况,并且是NullReferenceException的原因,那么看起来_httpContextBase。响应不是空的,因为它不会有同样的问题。

我不知道你的测试中设置了那个对象,但这可能是值得关注的。另外,你有没有试过反过来呢?我猜它与。request有关,而不是第二个存根。

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

相关文章: