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 方法中创建我的模拟的新实例。感谢您告诉我问题出在我的代码中,而不是最小起订量中。
我有这样的东西:
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 方法中创建我的模拟的新实例。感谢您告诉我问题出在我的代码中,而不是最小起订量中。