使用SetupGet模拟C#索引器失败,DummyChildren模拟未生效求助
问题分析与解决方案
错误原因
- 类型混淆:你创建的
mockDummyChildren是Mock<IDummy>类型,但IDummy.DummyChildren属性返回的是IDummyList接口,需要模拟的是IDummyList而非IDummy来处理索引器逻辑。 - 关联缺失:你没有将模拟的
IDummyList实例绑定到mockDummy的DummyChildren只读属性上,导致原IDummy对象的DummyChildren无法获取到期望的索引器行为。 - 拼写错误:代码中的
.Return()应为.Returns()(Moq框架的正确方法名)。
正确实现代码
// 模拟目标IDummy实例 Mock<IDummy> mockDummy = new Mock<IDummy> { DefaultValue = DefaultValue.Mock }; mockDummy.SetupGet(x => x.Name).Returns("XYZ"); // 模拟IDummyList实例,处理索引器逻辑 Mock<IDummyList> mockDummyList = new Mock<IDummyList>(); // 设置索引器"ABC"返回指定的mockDummy实例 mockDummyList.Setup(x => x["ABC"]).Returns(mockDummy.Object); // 将模拟的IDummyList绑定到mockDummy的DummyChildren属性 mockDummy.SetupGet(x => x.DummyChildren).Returns(mockDummyList.Object); // 验证使用示例: var dummy = mockDummy.Object; Console.WriteLine(dummy.Name); // 输出"XYZ" Console.WriteLine(dummy.DummyChildren["ABC"].Name); // 输出"XYZ"
关键说明
- 对于只读属性
DummyChildren,需通过SetupGet指定其返回值,也就是预先模拟好的IDummyList实例。 - 索引器的模拟直接针对
IDummyList的this[string]成员,无需通过IDummy的属性链设置,避免类型层级混淆。
内容的提问来源于stack exchange,提问作者SnippetCode
相关产品推荐
相关产品推荐

