C# MSTest-带有list参数的Moq设置返回空列表

C# MSTest-带有list参数的Moq设置返回空列表,c#,unit-testing,mocking,moq,mstest,C#,Unit Testing,Mocking,Moq,Mstest,我有这样的想法: WebRequestManagerMock .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>())) .Returns<IEnumerable<Order>>(orders => Task.FromResult<IEnumerabe<Item>>(m_Items.Take(orders.Count()))); We

我有这样的想法:

WebRequestManagerMock
    .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>()))
    .Returns<IEnumerable<Order>>(orders => Task.FromResult<IEnumerabe<Item>>(m_Items.Take(orders.Count())));
WebRequestManagerMock
.Setup(x=>x.GetItemsAsync(It.IsAny()))
.Returns(orders=>Task.FromResult(m_Items.Take(orders.Count()));
m_Items
是我在初始化类中填充的静态列表,它不是空的

调试测试时,
命令
也不是空的

当我调用
GetItemsAsync
时,无论有多少订单,我都会得到0个项目

模拟也是静态的

我做错了什么吗?

我为您的场景重新创建了一个测试,并能够使其通过。看看下面的例子

[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 { }
}
[TestClass]
公共类MoqSetupWithListParameterTests:MiscUnitTests{
//m_Items是我在初始化类中填充的静态列表,它不是空的。
静态IEnumerable m_Items=Enumerable.Range(1,10)。选择(i=>newitem());
//模拟也是静态的。
静态Mock WebRequestManagerMock=new Mock();
[测试方法]
公共作废物品数量应等于订单数量(){
//安排
预期风险价值=3;
//调试测试时,Orders也不是空的。
var m_Orders=Enumerable.Range(1,应为)。选择(i=>neworder());
WebRequestManagerMock
.Setup(x=>x.GetItemsAsync(It.IsAny()))
.Returns(orders=>Task.FromResult(m_Items.Take(orders.Count()));
var sut=WebRequestManagerMock.Object;
//表演
//当我调用GetItemsAsync时,我得到了预期的计数。
var actual=sut.GetItemsAsync(m_Orders).Result;
//断言
Assert.AreEqual(预期的,实际的.Count());
}
公共接口IWebRequestManager{
任务GetItemsAsync(IEnumerable enumerable);
}
公共类顺序{}
公共类项{}
}

显然我是瞎子。我没有注意到我正在TestInitialize方法中创建一个新的mock实例。感谢您告诉我问题在我的代码中,而不是在moq中。

感谢您的帮助。由于某些原因,VisualStudio无法识别异步测试,我无法运行它们。除此之外,我将我的mock移到了test-it-self,它有点工作,只是现在我对Returns表达式有一个问题-没有orders参数列表,它工作,但对它(lambda表达式)@user6251216没有,编辑了test,使它不再是异步的,仍然工作。注意这些变化,并查看它,它将立即识别测试。您使用的是什么版本的VS?您的目标是什么版本的.Net?最初是Visual Studio 2013和.Net 4,但最近我用.Net 4.5将其升级到了2015。我目前在
返回(…)
时遇到问题-它抛出了一个关于参数数量的反射异常,尽管我似乎没有括号或其他问题。正常的
返回
仍然有效。返回异步测试的任务;不要使用void@JeroenHeier我本来有任务,但海报上说他们的版本不允许他们在测试中使用任务