You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:24:02