【问题标题】:Mock IEnumerable<T> using moq使用 moq 模拟 IEnumerable<T>
【发布时间】:2017-04-24 07:01:47
【问题描述】:

有了这个接口,我如何使用 moq 模拟这个对象?

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

我明白了:

无法将表达式类型 IEnumerable 转换为 IMyCollection

【问题讨论】:

  • 为什么不直接做一个IList&lt;MyObject&gt;
  • @ShaneKm 请注意,从 .NET 4.5 开始,.NET IReadonlyList&lt;T&gt; 内置了一个类型,可以执行您尝试执行的确切合同,并且您可以从中受益已经被应用于像List&lt;T&gt;这样的内置类型

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


【解决方案1】:

如果是Count,则需要使用SetupGet()。在索引器的情况下,使用

mock.Setup(m => m[It.IsAny<int>()])

返回想要的值

【讨论】:

    【解决方案2】:
    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());
    

    mock 将使用具体的List 来包装和公开测试所需的行为。

    【讨论】:

    • 一年后,这拯救了我的一天!谢谢! +1
    【解决方案3】:

    对于我的用例,我需要返回一个空的 IEnumerable。

    mockObj.Setup(x => x.EnumerateBlah()).Returns(Enumerable.Empty<MyType>);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2019-09-11
      相关资源
      最近更新 更多