Как использовать метод настройки в moq?

Я могу попытаться понять Moq и как это работает? Когда мы должны использовать метод настройки? На мой взгляд, его документация слишком плохая. Во всяком случае. Я хочу поделиться своим кодом и тем, что я хотел сделать.

Класс тестируется.

  public interface IProduct
{
    bool GiveCard();
    float CalculateDiscount(decimal price, decimal discount);
}

   public class Product : IProduct
   {
    private IProduct _product;
    public string ProductName { get; set; }
    public int StockCount { get; set; }
    public float Discount { get; set; }
    public float Price { get; set; }

    public float CalculateDiscount(decimal price, decimal discount)
    {
        var discountedPrice = (price * discount) / 100;
        Discount = price - discountedPrice;
        return price - discountedPrice;
    }

     public bool GiveCard()
    {
        return CalculateDiscount(Price, Discount) > 300;
    }

}

** Класс модульных испытаний *

[Test]
    public void GiveCard_DiscountedAmountGreaterThanOrEqual300_ReturnTrue()
    {
        var mockObject = new Mock<IProduct>();
        var productService = new Product(mockObject.Object);

        mockObject.Setup(x => x.CalculateDiscount(450, 20)).Returns(360);
        var result = productService.GiveCard();
        Console.WriteLine(result);
    }

В качестве результата я получаю 0, хотя я установил результат вычисления для свойства Discount в методе CalculateDiscount().

2 ответа

Решение

_product объект CalculateDiscount метод не используется выше. Следовательно, установка вашего фиктивного объекта не получает удар. Вы можете попробовать это в своем классе продукта:

public bool GiveCard()
{
    return _product.CalculateDiscount(Price, Discount) > 300;
} 

В этом случае заданный метод фиктивного объекта CalculateDiscount получает удар и возвращает 360 для вас.

если вы все еще используете такую ​​настройку: mockObject.Setup(x => x.CalculateDiscount(450, 20)).Returns(360);, вы должны поставить productService.Price как 450 и productService.Discount как 20

Примечание: вы также можете утверждать, что функция mockObject была получена или нет:

mockObject.Verify(mock => mock.CalculateDiscount(450,20), Times.Once());
  mockObject.Setup(x => x.CalculateDiscount(It.IsAny<int>(), It.IsAny<int>())).Returns(360);
Другие вопросы по тегам