MSTest - 带有列表参数 returns 空列表的最小起订量设置

MSTest - Moq setup with a list parameter returns empty list

我有这样的东西:

WebRequestManagerMock
    .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>()))
    .Returns<IEnumerable<Order>>(orders => Task.FromResult<IEnumerabe<Item>>(m_Items.Take(orders.Count())));

m_Items是我在Class初始化时填的静态列表,不是空的。

我调试测试的时候

Orders也不为空。

当我调用 GetItemsAsync 时,无论有多少订单,我都得到 0 件商品。

模拟也是静态的。

我做错了什么吗?

我为您的场景重新创建了一个 Minimal, Complete, and Verifiable example 测试,并且能够让它通过。看看下面

[TestClass]
public class MoqSetupWithListParameterTests : MiscUnitTests {
    //m_Items is a static list I filled in the Class Initialize, and is not empty. 
    static IEnumerable<Item> m_Items = Enumerable.Range(1, 10).Select(i => new Item());
    //The mock is also static. 
    static Mock<IWebRequestManager> WebRequestManagerMock = new Mock<IWebRequestManager>();

    [TestMethod]
    public void Items_Count_Should_Equal_Orders_Count() {
        //Arrange
        var expected = 3;
        //Orders is also not empty when I debug the test.
        var m_Orders = Enumerable.Range(1, expected).Select(i => new Order());
        WebRequestManagerMock
            .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>()))
            .Returns<IEnumerable<Order>>(orders => Task.FromResult(m_Items.Take(orders.Count())));

        var sut = WebRequestManagerMock.Object;

        //Act
        //When I call GetItemsAsync I get expected count.
        var actual = sut.GetItemsAsync(m_Orders).Result;

        //Assert
        Assert.AreEqual(expected, actual.Count());
    }

    public interface IWebRequestManager {
        Task<IEnumerable<Item>> GetItemsAsync(IEnumerable<Order> enumerable);
    }

    public class Order { }
    public class Item { }
}

看来我是个瞎子。我没有注意到我正在 TestInitialize 方法中创建我的模拟的新实例。感谢您告诉我问题出在我的代码中,而不是最小起订量中。