我需要找出传递给索引器的值。
我需要测试的代码(c#)如下:
string cacheKey = GetCacheKey(cacheKeyRequest);
string cachedValue = myCache[cacheKey] as string;
因此,我需要能够识别传递给索引器的“cacheKey”的值。
我尝试使用缓存对象的模拟:
var cache = MockRepository.GenerateMock<WebDataCache>();
这个想法是在代码执行完之后,我会查询mock来识别传递给索引器的值:
var actualCacheKey = cache.GetArgumentsForCallsMadeOn(a => a["somevalue"], opt => opt.IgnoreArguments())[0][0].ToString();
这给了我一个编译错误:只能将赋值,调用,递增,递减和新对象表达式用作语句。
我看到了一个建议,可以通过以下方式使其成为一个功能:
var actualCacheKey = cache.GetArgumentsForCallsMadeOn(a => a["somevalue"] = null, opt => opt.IgnoreArguments())[0][0].ToString();
现在编译,但抛出运行时InvalidOperationException:没有设置要求验证的期望,确保操作中的方法调用是虚拟(C#)/可覆盖(VB.Net)方法调用。
有什么建议吗? [使用RhinoMocks.3.6.1]
非常感谢提前
格里夫
PS - 我之前在http://groups.google.com/group/rhinomocks发布了此消息,但几天之后,观看次数仍然低得令人沮丧。
答案 0 :(得分:3)
该例外确切地告诉您发生了什么:
InvalidOperationException:没有设置要求验证,确保操作中的方法调用是虚拟(C#)/可覆盖(VB.Net)方法调用。
这意味着,为了让Rhino正常工作(或者,为了让Castle生成working proxies),您的索引器必须是虚拟的。如果你不能这样做,Rhino在这种情况下不会帮助你。
将索引器设为虚拟后,这是一项简单的任务:
var cache = MockRepository.GenerateMock<WebDataChache>();
cache.Expect(c => c["SomeKey"]).Returns("SomeValue");
// perform actual test
cache.VerifyAllExpectations();
这可确保使用["SomeKey"]
访问缓存。如果键值不同,则测试将在VerifyAllExpectations
行失败。