0

精简版:

如何让 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. 该异常没有任何内部异常。但是,当我将鼠标悬停在Cacheof上时x.Cache,我收到以下错误消息作为值x.Cache:“ 'x.Cache' throw an exception of typeSystem.InvalidOperationException ”并且所述异常的消息是“*Previous method 'HttpContextBase.get_Cache() ;' 需要返回值或抛出异常。*”。

好吧,我想我明白为什么只要mock.ReplayAll()没有被调用就会发生这种情况,但我不知道为什么会在之后发生。

总而言之,我怎样才能让它发挥作用?如何让 Rhino Mocks 模拟调用HttpContext.Cache["MyKey"]并返回预期数据?

4

1 回答 1

0

好的,实际上没有必要存根它。调用后,mocks.ReplayAll()我只需要使用将我想要的任何内容插入缓存

_context.Cache.Insert("MyKey", foo);

唯一的缺点是在测试的初始化方法中似乎没有办法使用这个。

于 2013-03-07T08:50:47.347 回答