【问题标题】:RhinoMocks - Getting the value passed into an Indexer (this[])RhinoMocks - 获取传递给索引器的值 (this[])
【发布时间】:2012-06-14 16:42:22
【问题描述】:

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

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

【问题讨论】:

    标签: unit-testing arguments rhino-mocks


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2018-09-24
      • 2015-09-13
      • 2012-06-25
      相关资源
      最近更新 更多