精简版:
如何让 Rhino Mocks 模拟调用HttpContext.Cache["MyKey"]
并返回预期数据?
长版:
我需要HttpContext.Cache
用 Rhino Mocks 模拟一个返回值。我在TestInitialize
(Visual Studio)单元测试的方法中使用了以下代码
// All these are fields on my Unit test class.
foo = new Foo();
mock = new MockRepository();
context = mocks.DynamickMock<HttpContextBase>();
var cache = context.Stub(x => x.Cache).Return(HttpRuntime.Cache);
到目前为止,一切都很好。现在我尝试了以下两个:
cache.Stub(x => x["MyKey"]).Return(foo);
和
context.Stub(x => x.Cache["MyKey"]).Return(foo);
第一个甚至不会编译。Visual Studio 告诉我,我不能“将 [] 索引应用于 'Rhino.Mocks.Interfaces.IMethodOptions' 类型的表达式”。
第二个编译但我得到一个NullReferenceException
. 我想这是因为我还没有打电话mock.ReplayAll();
。当我在测试中(之前或之后mock.ReplayAll()
)移动这条线时,我仍然得到一个NullReferenceException
. 该异常没有任何内部异常。但是,当我将鼠标悬停在Cache
of上时x.Cache
,我收到以下错误消息作为值x.Cache
:“ 'x.Cache' throw an exception of typeSystem.InvalidOperationException
”并且所述异常的消息是“*Previous method 'HttpContextBase.get_Cache() ;' 需要返回值或抛出异常。*”。
好吧,我想我明白为什么只要mock.ReplayAll()
没有被调用就会发生这种情况,但我不知道为什么会在之后发生。
总而言之,我怎样才能让它发挥作用?如何让 Rhino Mocks 模拟调用HttpContext.Cache["MyKey"]
并返回预期数据?