使用Moq验证方法是否被调用

时间:2009-10-24 03:59:28

标签: moq

我有一个类:

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方法?有人可以提供一个简单的例子吗?

2 个答案:

答案 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);