2013-03-07 78 views
0

短版:如何模拟使用Rhino Mocks对HttpContext.Cache [“MyKey”]的调用?

如何获得犀牛制品的呼叫模拟到HttpContext.Cache["MyKey"]并返回预期的数据?

龙版本:

我需要模拟从HttpContext.Cache与犀牛嘲笑返回值。我用我的(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); 

到目前为止好的TestInitialize方法下面的代码。现在,我想这两个如下:

cache.Stub(x => x["MyKey"]).Return(foo); 

context.Stub(x => x.Cache["MyKey"]).Return(foo); 

第一个甚至不会编译。视觉工作室告诉我,我不能“应用索引与[]到类型'Rhino.Mocks.Interfaces.IMethodOptions'”的表达式。

第二个编译但我得到一个NullReferenceException。我想这是因为我没有打电话给mock.ReplayAll();。当我在测试中移动这条线(在mock.ReplayAll()之前或之后)时,我仍然得到NullReferenceException。异常没有任何内部异常。然而,当我悬停的x.CacheCache,我得到为x.Cache值以下错误信息:“‘x.Cache’扔System.InvalidOperationException类型的异常”而说异常的消息是“* Previous方法'HttpContextBase.get_Cache();'需要返回值或抛出异常。*“。

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

所以总而言之,我该如何得到这个工作?如何让Rhino Mocks模拟拨打HttpContext.Cache["MyKey"]并返回预期数据?

回答

0

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

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

唯一的缺点是,似乎没有办法在测试的初始化方法来使用它。

相关问题