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我本来有任务,但海报上说他们的版本不允许他们在测试中使用任务