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

如何使用Fake It Easy模拟带索引属性的接口?

使用Fake It Easy模拟带索引属性的接口

我需要模拟一个带有索引属性的接口,该接口定义如下:

public interface MultipleLines
{
    [DispId(201)]
    int Count
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        [DispId(201)]
        get;
    }

    [DispId(202)]
    SomeLine this[[In] int Index]
    {
        [MethodImpl(MethodImplOptions.InternalCall)]
        [DispId(202)]
        [return: MarshalAs(UnmanagedType.Interface)]
        get;
    }
}

请问如何使用Fake It Easy为MultipleLines.Item[0]或任意数值设置返回值?我编写了如下测试代码:

[Fact]
public void Test1()
{
    var myValue = new SomeLine();
    var mockedLines = A.Fake<MultipleLines>();
    A.CallTo(() => mockedLines.Item[1]).Returns(myValue);
}

其中如下简单调用可以正常工作:

var line= mockedLines.Item[1];

解决方案

你的测试代码已经能正确为特定索引(比如示例中的1)设置返回值。如果需要覆盖更多场景,可以参考以下写法:

1. 为任意索引设置统一返回值

使用A<int>.Ignored匹配所有整数索引,让任意索引都返回同一个预设实例:

[Fact]
public void TestAnyIndex()
{
    var myValue = new SomeLine();
    var mockedLines = A.Fake<MultipleLines>();
    A.CallTo(() => mockedLines.Item[A<int>.Ignored]).Returns(myValue);
}

2. 根据索引动态返回不同值

通过ReturnsLazily接收索引参数,动态生成或返回对应的值:

[Fact]
public void TestDynamicReturnValue()
{
    var mockedLines = A.Fake<MultipleLines>();
    A.CallTo(() => mockedLines.Item[A<int>.Ignored])
        .ReturnsLazily((int index) => 
        {
            // 这里可以根据index自定义返回逻辑
            return new SomeLine { /* 比如给LineNumber赋值为index */ };
        });
}

另外需要说明:接口中的DispId等COM属性不会影响Fake It Easy的模拟逻辑,它基于.NET反射机制识别索引属性,你当前针对特定索引的写法是完全有效的。

内容的提问来源于stack exchange,提问作者Székely Réka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:57:30