如何使用Moq设置C#中的索引器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

我无法弄清楚如何使用Moq在C#中设置索引器。Moq文档很菜,而且我做了大量的搜索......我想要做的是类似:

var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);

我想修改上面的任何索引和任何值的工作,所以我可以做这样的事情:

someClass.Object.SomeIndexedProperty[1] = 5;

目前,我有以下内容,这对于索引属性getter非常适用,但如果我设置了Moq忽略它的值:

var someValues = new int[] { 10, 20, 30, 40 };
var someClass = new Mock<ISomeClass>();
someClass.Setup(o => o.SomeIndexedProperty[It.IsAny<int>()])
    .Returns<int>(index => someValues[index]);

// Moq doesn't set the value below, so the Assert fails!
someClass.Object.SomeIndexedProperty[3] = 25;
Assert.AreEqual(25, someClass.Object.SomeIndexedProperty[3]);
提问于
用户回答回答于

我找到了解决问题的方法。它需要我换个思路......我一直在寻找使用NUnit's Assert来验证我的someClass模拟器中的索引器是否被调用了正确的值。

看起来用Moq支持的方式是使用这个VerifySet函数。一个人为的例子:

someClass.Object.SomeIndexedProperty[3] = 25;
someClass.VerifySet(mock => mock.SomeIndexedProperty[3] = 25);

单元测试因为SomeIndexedProperty[3]设置为25,所以会失败。

用户回答回答于

使用Moq 3.1.416.3

安装程序不适用于索引器(因为它需要一个表达式,这意味着排除语句被排除)

所以你需要使用SetupSet

_settingsStore.SetupSet(store => store["MruNotes"] = It.IsAny<string>())
                .Callback<string,string>( (key, value) => persistedValue = value);

扫码关注云+社区