C# 中如何创建可用于单元测试的 IPage<T> 对象
解决方案
错误原因
List<T>未实现IPage<T>接口,强转不合法,因此触发类型转换异常- 官方提供的
Page实现类构造函数为内部级,外部代码无法直接new创建实例
方案1:使用现有Moq框架直接模拟IPage实例(推荐)
你项目已经引入Moq,直接mockIPage<T>接口即可,无需额外自定义实现:
// 构造测试用的资源列表 var testData = new List<GenericResourceInner> { new GenericResourceInner(), new GenericResourceInner(), new GenericResourceInner() }; var mockPage = new Mock<IPage<GenericResourceInner>>(); // 配置枚举行为返回测试数据 mockPage.Setup(p => p.GetEnumerator()).Returns(testData.GetEnumerator()); // 兼容非泛型枚举调用,避免运行时报错 mockPage.As<IEnumerable>().Setup(p => p.GetEnumerator()).Returns(testData.GetEnumerator()); // 无后续分页时设置NextPageLink为null,如需模拟多分页可设置为自定义标识 mockPage.Setup(p => p.NextPageLink).Returns(null as string); // 拿到可用的IPage实例 IPage<GenericResourceInner> _resourceList = mockPage.Object;
方案2:自定义IPage实现类(适合多处复用场景)
自己写一个简易的IPage<T>实现类,后续所有单测需要构造IPage的场景都可以复用:
using System.Collections; using Microsoft.Rest.Azure; public class TestPage<T> : IPage<T> { private readonly IEnumerable<T> _data; public TestPage(IEnumerable<T> data, string nextPageLink = null) { _data = data ?? throw new ArgumentNullException(nameof(data)); NextPageLink = nextPageLink; } public string NextPageLink { get; } public IEnumerator<T> GetEnumerator() => _data.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } // 直接实例化使用 readonly IPage<GenericResourceInner> _resourceList = new TestPage<GenericResourceInner>(new List<GenericResourceInner> { new GenericResourceInner(), new GenericResourceInner(), new GenericResourceInner() });
内容的提问来源于stack exchange,提问作者SyncMaster
相关产品推荐
相关产品推荐

