C# Rhinomock在两次删除同一对象时失败?

C# Rhinomock在两次删除同一对象时失败?,c#,mocking,rhino-mocks,C#,Mocking,Rhino Mocks,我想代码会比我糟糕的标题更好地解释这个问题 \u httpContextBase是一个httpContextBase,但我认为这并不重要\u httpCookiecollection只是一个httpCookiecollection //Works fine _httpContextBase.Stub(c => c.Response.Cookies).Return(_httpCookieCollection); //Fails after attempting to stub the se

我想代码会比我糟糕的标题更好地解释这个问题

\u httpContextBase
是一个
httpContextBase
,但我认为这并不重要
\u 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);
//很好用
_Stub(c=>c.Response.Cookies).Return(_httpCookieCollection);
//尝试存根第二行后失败。“对象引用未设置为对象的实例”。第一行可以通过。
_Stub(c=>c.Response.Cookies).Return(_httpCookieCollection);
_Stub(c=>c.Request.Cookies).Return(_httpCookieCollection);
//变通
var responseBaseMock=MockRepository.GenerateMock();
responseBaseMock.Stub(r=>r.Cookies).Return(\u httpCookieCollection);
_Stub(c=>c.Response).Return(responseBaseMock);
var requestBaseMock=MockRepository.GenerateMock();
requestBaseMock.Stub(r=>r.Cookies).Return(\u httpCookieCollection);
_Stub(c=>c.Request).Return(requestBaseMock);
假设上述测试都是各自的方法。每个注释都解释了当下面的代码运行时会发生什么

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


项目2的堆栈跟踪(即使第1行和第2行颠倒,堆栈跟踪也是相同的)

System.NullReferenceException:对象引用未设置为对象的实例。
在Api.Tests\Client\CookieTests.cs中的Api.Tests.Client.CookieTests.c.b__12_1(HttpContextBase c)中:第113行
在Rhino.Mocks.RhinoMocksExtensions.Expect[T,R](T mock,函数'2 action)
在Rhino.Mocks.rhinomocksextenses.Stub[T,R](T mock,函数'2 action)
在.Api.Tests\Client\CookieTests.cs中的.Api.Tests.Client.CookieTests.Test()处:第113行

我还没有试过你的代码,所以我可能不对。但可能是_httpContextBase.Request为null。如果是这种情况,并且是NullReferenceException的原因,那么_httpContextBase.Response似乎不是null,因为这不存在相同的问题

我不知道您的测试中是否设置了该对象,但这可能值得一看。还有,你试过其他方法吗?我猜这与.Request有关,而不是第二个存根


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

我知道我参加聚会有点晚了,这对提问者来说可能不再重要,但我仍然会为Rhino Mocks的新手负责


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

你好,感谢您的回复。响应和请求都是独立工作的。就好像我要接受第一个“工作正常”的项目,并更改对请求的响应,这将是正常的。如果我交换项目2中的行,那么第二行仍然会崩溃。不过,你对最后一部分的意见很好!我看不出温莎在这个问题上有什么用处,但也许是Rhinomock,你有没有错误地给你的问题加上标题和标签?包含异常的堆栈跟踪也是一个好主意。@JonathonRossi哦……我确实这么做了。谢谢乔纳森!
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