如何使用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
相关产品推荐
相关产品推荐

