【问题标题】:How to use setup method in moq?如何在起订量中使用设置方法?
【发布时间】:2019-02-03 02:14:20
【问题描述】:

我可以尝试了解起订量以及它是如何工作的?什么时候应该使用setup方法?在我看来,它的文档太差了。无论如何。我想分享我的代码和我想做的事情。

正在测试的类。

  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);
    }

虽然我在CalculateDiscount() 方法中将计算结果设置为Discount 属性,但结果却是0。

【问题讨论】:

  • “被测类”实际上不是类。请提供课程
  • 参数必须匹配 Moq 才能使用该方法。 alerya 的答案应该有效,但here is a little more information
  • mockObject.Setup(x =&gt; x.CalculateDiscount(It.IsAny&lt;int&gt;(), It.IsAny&lt;int&gt;())).Returns(360); 可能足以解决您的问题。但是,您的问题没有提供足够的信息。比如productService.GiveCard()什么时候调用IProduct.CalculateDiscount(float , float )函数?
  • @AdemCatamak 我认为我提供了足够的信息。对产品应用折扣时调用 GiveCard 方法。 GiveCard() 方法在总价等于或大于 300 时赠送卡片。代码说明一切。请仔细阅读。
  • 我看不到无参数的 GiveCard 方法,也看不到 ProductService 类。因此,我想给你适当的帮助;如果你能提供更多的信息,你就能得到更明确的答案。

标签: c# unit-testing mocking nunit moqcontrib


【解决方案1】:
  mockObject.Setup(x => x.CalculateDiscount(It.IsAny<int>(), It.IsAny<int>())).Returns(360);

【讨论】:

    【解决方案2】:

    _product对象CalculateDiscount上面没有使用方法。因此,您的模拟对象的设置不会受到影响。您可以在您的产品类中尝试这样做:

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

    在这种情况下,给定的模拟对象 CalculateDiscount 方法被命中并为您返回 360。

    如果你仍然使用这样的设置:mockObject.Setup(x =&gt; x.CalculateDiscount(450, 20)).Returns(360);,你应该提供 productService.Price 作为 450 和 productService.Discount 作为 20

    注意:你也可以断言 mockObject 函数是否被命中:

    mockObject.Verify(mock => mock.CalculateDiscount(450,20), Times.Once());
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多