簡體   English   中英

MSTest - 帶有list參數的Moq設置返回空列表

[英]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 Initialize的靜態列表,不是空的。

調試測試時, Orders也不為空。

當我調用GetItemsAsync無論有多少訂單,我都會得到0個項目。

模擬也是靜態的。

我做錯了嗎?

我為您的場景重新創建了一個Minimal,Complete和Verifiable測試示例 ,並且能夠讓它通過。 看一下以下內容

[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方法中創建了我的mock的新實例。 感謝您告訴我問題出在我的代碼而不是moq中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM