如何Mock自定义对象列表并配置返回指定真实实例
模拟包含真实实例的IList对象
要让Moq创建的IList<IValidatableTable> Mock实例返回你的真实ValidatableTable对象,需要手动配置IList接口的核心成员(比如索引器、Count属性、枚举器),以下是具体实现:
完整示例代码
// 1. 创建并配置真实实例 var validatableTable = new ValidatableTable(); // 这里添加你的对象配置逻辑,比如设置属性等 // 2. 创建IList的Mock实例 var myMock = new Mock<IList<IValidatableTable>>(); // 3. 设置Count属性,返回列表中元素的数量(这里是1) myMock.SetupGet(x => x.Count).Returns(1); // 4. 设置索引器:当访问索引0时返回真实实例,其他索引抛出标准异常 myMock.Setup(x => x[It.IsAny<int>()]) .Returns((int index) => index == 0 ? validatableTable : throw new IndexOutOfRangeException()); // 5. 如果代码中需要遍历列表,配置枚举器返回包含真实实例的枚举器 var backingList = new List<IValidatableTable> { validatableTable }; myMock.Setup(x => x.GetEnumerator()).Returns(backingList.GetEnumerator()); // 可选:如果需要用到Contains方法,可额外配置 myMock.Setup(x => x.Contains(validatableTable)).Returns(true);
关键说明
- IList是一个接口,Moq不会自动实现集合的默认行为,必须手动设置测试场景需要用到的成员。
- 若仅需访问索引0和Count属性,步骤3、4即可满足需求;若代码会遍历列表(比如foreach循环),则必须配置GetEnumerator。
- 对于其他IList方法(如Add、Remove),如果测试场景需要用到,可按类似方式用Setup配置对应行为。
内容的提问来源于stack exchange,提问作者deepo
相关产品推荐
相关产品推荐

