Использование Moq для проверки того, что метод был вызван - PullRequest
0 голосов
/ 24 октября 2009

У меня есть класс, как:

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

Ответы [ 2 ]

5 голосов
/ 24 октября 2009

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

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

Если вы действительно хотите использовать 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)));
}
2 голосов
/ 29 октября 2009

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

Assert.True(store.Products.Count == 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...