模拟IEnumerable <t>使用moq

时间:2016-12-08 21:59:38

标签: c# asp.net unit-testing moq

有了这个界面,如何使用moq模拟这个对象?

public interface IMyCollection : IEnumerable<IMyObject>
{
    int Count { get; }
    IMyObject this[int index] { get; }
}

我明白了:

  

无法将表达式IEnumerable转换为IMyCollection

3 个答案:

答案 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>);