1

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

我需要测试的代码(c#)如下:

string cacheKey = GetCacheKey(cacheKeyRequest);
string cachedValue = myCache[cacheKey] as string;

所以,我需要能够识别传递给索引器的“cacheKey”的值。

我尝试使用缓存对象的 Mock 进行此操作:

var cache = MockRepository.GenerateMock<WebDataCache>();

这个想法是在代码执行后,我将查询模拟以识别已传递​​到索引器的值:

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上发布过此内容,但几天后,观看次数仍然低得令人沮丧。

4

1 回答 1

3

异常告诉你到底发生了什么:

InvalidOperationException:没有设置要验证的期望,请确保操作中的方法调用是虚拟(C#) / 可覆盖 (VB.Net) 方法调用。

这意味着,为了让 Rhino 正常工作(或者为了让 Castle 生成工作代理),你的索引器必须是虚拟的。如果你做不到,Rhino 不会在这种情况下帮助你。

将索引器设为虚拟后,任务就很简单了:

var cache = MockRepository.GenerateMock<WebDataChache>();
cache.Expect(c => c["SomeKey"]).Returns("SomeValue");

// perform actual test

cache.VerifyAllExpectations();

这可确保使用 访问缓存["SomeKey"]。如果键值不同,则测试将失败VerifyAllExpectations

于 2012-06-15T09:37:45.167 回答