首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中使用Moq设置索引器

在C#中使用Moq设置索引器
EN

Stack Overflow用户
提问于 2010-05-27 04:05:00
回答 2查看 6.7K关注 0票数 20

我很难弄清楚如何用Moq在C#中设置indexers。Moq文档很弱,我做了很多搜索...我想要做的事情与How to Moq Setting an Indexed property的解决方案类似

代码语言:javascript
复制
var someClass = new Mock<ISomeClass>();
someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25);

我想修改上面的代码,使其适用于任何索引和任何值,这样我就可以这样做了:

代码语言:javascript
复制
someClass.Object.SomeIndexedProperty[1] = 5;

目前我有以下内容,它对索引属性getter非常有效,但是如果我设置了值Moq就会忽略它:

代码语言:javascript
复制
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]);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-27 21:51:51

我找到了解决我的问题的办法。这需要我的思维方式转变。我一直希望使用NUnit的Assert来验证我的someClass模拟中的索引器设置器是用正确的值调用的。

似乎使用Moq时,支持的方法是使用VerifySet函数。一个人为的例子:

代码语言:javascript
复制
someClass.Object.SomeIndexedProperty[3] = 25;
someClass.VerifySet(mock => mock.SomeIndexedProperty[3] = 25);

由于SomeIndexedProperty[3]设置为25,因此单元测试通过,否则单元测试将失败。

票数 12
EN

Stack Overflow用户

发布于 2010-11-28 02:47:38

使用Moq 3.1.416.3

设置不适用于索引器(因为它接受一个表达式,这意味着赋值语句被排除了)

所以你需要像这样使用SetupSet

代码语言:javascript
复制
_settingsStore.SetupSet(store => store["MruNotes"] = It.IsAny<string>())
                .Callback<string,string>( (key, value) => persistedValue = value);

一个小小的警告:这个表达式只有在关键字为"MruNotes“时才匹配。我不能使用像It.IsAny这样的匹配器来获取密钥。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2916348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档