当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 12:39:08 C#

ChallengeIndexersinC#UsingMoqMoq文档很薄弱,我做了很多搜索......我想做的就像在如何设置索引属性的解决方案中一样:varsomeClass=newMock();someClass.SetupSet(o=>o.SomeIndexedProperty[3]=25);我想修改上面的内容以适用于任何索引和任何值,所以我可以这样做:someClass.Object.SomeIndexedProperty[1]=5;目前我有以下内容,它非常适合索引属性获取器,但如果我设置一个值,Moq会忽略它:varsomeValues=newint[]{10,20,30,40};varsomeClass=newMock();someClass.Setup(o=>o.SomeIndexedProperty[It.IsAny()]).Returns(index=>someValues[index]);//Moq没有设置下面的值,所以Assert失败了!someClass.Object.SomeIndexedProperty[3]=25;Assert.AreEqual(25,someClass.Object.SomeIndexedProperty[3]);我找到了解决问题的办法。它需要改变我的想法......我一直在寻找使用NUnit的断言来验证我的someClass模拟中的索引器设置器是否正在使用正确的值调用。似乎使用Moq支持的方法是使用VerifySet函数。一个人为的例子:someClass.Object.SomeIndexedProperty[3]=25;someClass.VerifySet(mock=>mock.SomeIndexedProperty[3]=25);单元测试通过是因为SomeIndexedProperty[3]设置为25,否则会失败。使用Moq3.1.416.3安装程序不适用于索引器(因为它需要一个表达式,这意味着排除了赋值语句)所以你需要使用SetupSetlike_settingsStore.SetupSet(store=>store["MruNotes"]=It.IsAny()).Callback((key,value)=>persistedValue=value);一个小警告:此表达式仅在键为“MruNotes”时才匹配。我不能使用像It.IsAny这样的匹配器。在您的测试中,您在索引器的getter上设置的唯一期望-这将始终返回数组中的相应值。索引器的行为不像真实的东西。有几件事你可以尝试修复它:你可以检查你是否可以存根这个索引器。我个人用的是RhinoMocks,所以不知道这个有没有实现someClass.SetupProperty(f=>f.SomeIndexedProperty);您也可以尝试模拟setter并使其更改底层数组。我的第一个猜测是沿着这些方向尝试一些东西(不保证它会起作用):someClass.Setup(o=>o.SomeIndexedProperty[It.IsAny()]=It.IsAny()).Callback((index,value)=>someValues[索引]=值);或者,如果ISomeClass接口足够小,您可以自己创建一个存根实现(将索引器实现为字典、数组等)。在C#中设置索引器以共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员。删除。如需转载请注明出处: