有了这个界面,如何使用moq模拟这个对象?
public interface IMyCollection : IEnumerable<IMyObject>
{
int Count { get; }
IMyObject this[int index] { get; }
}
我明白了:
无法将表达式IEnumerable转换为IMyCollection
答案 0 :(得分:16)
var itemMock = new Mock<IMyObject>();
var 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());
模拟将使用具体的List
来包装并公开测试所需的行为。
答案 1 :(得分:2)
对于Count,您需要使用 SetupGet()。如果是Indexer,请使用
mock.Setup(m => m[It.IsAny<int>()])
返回所需的值
答案 2 :(得分:-1)
对于我的用例,我需要返回一个空的 IEnumerable。
mockObj.Setup(x => x.EnumerateBlah()).Returns(Enumerable.Empty<MyType>);