RhinoMocks - 获取传递给Indexer的值(this [])

时间:2012-06-14 16:42:23

标签: unit-testing arguments rhino-mocks

我需要找出传递给索引器的值。

我需要测试的代码(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发布了此消息,但几天之后,观看次数仍然低得令人沮丧。

1 个答案:

答案 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行失败。