Использование 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, как я могу убедиться, что был вызван метод добавления списка продуктов? Может ли кто-нибудь привести простой пример?


moq
person Community    schedule 24.10.2009    source источник


Ответы (2)


Ну, на данный момент вы не можете ничего издеваться над чем-либо, поскольку список продуктов настроен в конструкторе по умолчанию?

Проще всего было бы вручную проверить свою коллекцию продуктов (т. Е. Просто проверить, есть ли там продукт с указанным идентификатором и кодом), тогда вам вообще не нужно беспокоиться о насмешках.

Если вы действительно хотите использовать Moq для проверки этого, вам нужно предоставить средства для внедрения вашего Mock и обойти ваш конструктор, например, вы можете предоставить два конструктора

public class Store {

    public Store() : this(new List<Product>()) {

    }

    public Store(IList<Product> productList) {
       Products = productList
    }
    //Implementation
}

Затем вы можете написать тест против вашего метода добавления следующим образом

[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)));
}
person John Foster    schedule 24.10.2009

Вам нужно проверить, было ли вызвано добавление или что список теперь содержит ожидаемое количество элементов?

Assert.True(store.Products.Count == 1);
person Aaron Fischer    schedule 29.10.2009