C# 模拟IEnumerable<;T>;使用最小起订量
有了这个接口,我如何使用moq模拟这个对象C# 模拟IEnumerable<;T>;使用最小起订量,c#,asp.net,unit-testing,moq,C#,Asp.net,Unit Testing,Moq,有了这个接口,我如何使用moq模拟这个对象 public interface IMyCollection : IEnumerable<IMyObject> { int Count { get; } IMyObject this[int index] { get; } } 公共接口IMyCollection:IEnumerable { 整数计数{get;} IMyObject此[int索引]{get;} } 我得到: 无法将表达式类型IEnumerable转换为IM
public interface IMyCollection : IEnumerable<IMyObject>
{
int Count { get; }
IMyObject this[int index] { get; }
}
公共接口IMyCollection:IEnumerable
{
整数计数{get;}
IMyObject此[int索引]{get;}
}
我得到:
无法将表达式类型IEnumerable转换为IMyCollection
在计数的情况下,需要使用SetupGet()。对于索引器,使用
mock.Setup(m => m[It.IsAny<int>()])
mock.Setup(m=>m[It.IsAny())
返回所需的值var itemMock=new Mock();
var itemMock = new Mock<IMyObject>();
List<IMyObject> items = new List<IMyObject> { itemMock.Object }; //<--IEnumerable<IMyObject>
var mock = new Mock<IMyCollection>();
mock.Setup(m => m.Count).Returns(() => items.Count);
mock.Setup(m => m[It.IsAny<int>()]).Returns<int>(i => items.ElementAt(i));
mock.Setup(m => m.GetEnumerator()).Returns(() => items.GetEnumerator());
列表项=新列表{itemMock.Object};//m、 返回(()=>items.Count);
mock.Setup(m=>m[It.IsAny()])。返回(i=>items.ElementAt(i));
mock.Setup(m=>m.GetEnumerator())。返回(()=>items.GetEnumerator());
模拟将使用具体的
列表
包装并公开测试所需的行为。对于我的用例,我需要返回一个空的IEnumerable
mockObj.Setup(x => x.EnumerateBlah()).Returns(Enumerable.Empty<MyType>);
mockObj.Setup(x=>x.EnumerateBlah()).Returns(Enumerable.Empty);
为什么不直接执行IList
?@ShaneKm正如您所知,从.NET 4.5开始,.NET中内置了一个类型,它与您尝试执行的契约完全一致,一年后,它已经被应用于List
等内置类型,这节省了我的时间!谢谢大家!+1.