我有一个类:
public class Store
{
public Store()
{
Products = new List<Product>();
}
public IList<Product> Products {get; private set;}
public void AddProduct(int id, string productCode)
{
Product p = new Product();
p.Id = id;
p.ProductCode = productCode;
//Validate before adding
Products.Add(p); //How can i verify that this was called
}
}
使用Moq如何验证是否已调用Products List的Add方法?有人可以提供一个简单的例子吗?
答案 0 :(得分:5)
当你在默认构造函数中设置Products列表时,你现在无法真正模拟任何东西吗?
最简单的方法是手动断言您的产品系列(即只是验证那里有带有指定ID和代码的产品),然后您根本不必担心嘲笑。
如果你真的想用Moq来测试它,你需要提供一种方法来注入你的Mock并绕过你的构造函数,例如你可以提供两个构造函数
public class Store {
public Store() : this(new List<Product>()) {
}
public Store(IList<Product> productList) {
Products = productList
}
//Implementation
}
然后,您可以针对add方法编写测试,如下所示
[Test]
public AddProduct_WithIdAndProductCode_AddsProductToCollection() {
int productId = 0;
string productCode = "a";
var productListMock = new Mock<IList<Product>>();
Store store = new Store(productListMock.Object);
store.AddProduct(productId, productCode);
productListMock.Verify(pl =>
pl.Add(It.Is<Product>(p =>
p.Id == productId && p.ProductCode == productCode)));
}
答案 1 :(得分:2)
您是否需要测试调用添加的内容,或者列表现在是否具有预期的项目数?
Assert.True(store.Products.Count == 1);