UnitTest-测试来自mock的方法时出现问题

本文关键字:问题 方法 测试 mock UnitTest- | 更新日期: 2023-09-27 18:21:58

我有一个使用接口的类,它有一个void方法,看起来像这个switch现在是完全可用的方法:

public void SellGivenQuantityOfProduct(Product product, int quantity)
{
    product.StockQuantity = product.StockQuantity - quantity;
}

但是以TDD的方式工作,我开始像下面这样做,但在我的测试方法中从未发生过计算

    [TestMethod]
    public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
    {
        var mock = new Mock<ISellBuyPipeLine>();
        mock.Setup(o => o.Products).Returns(new Product[]
        {
            new Product() {ArticleNr = 87, StockQuantity = 10}
        });
        var product = mock.Object.Products.First();
        var choosenProductToSell = new SellBuyProduct() {Product = product, Quantity = 5};
        mock.Object.SellGivenQuantityOfProduct(product, choosenProductToSell.Quantity);
        /*var test = new SellBuyPipeLine();
        test.SellGivenQuantityOfProduct(product, choosenProductToSell.Quantity);*/
        int expectedSellValue = product.StockQuantity;
        Assert.AreEqual(5, expectedSellValue);
    }

如果我使用未注释的行,并直接命中持有我的方法的类,它会起作用!但我想用模拟。

我做错了什么?

我用错方法了吗?

UnitTest-测试来自mock的方法时出现问题

如果要测试实现,请测试实现。mock对象的方法不包含实现。

您可能想要模拟Product,使测试方法看起来像这样:

public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
{
    // Arrange
    int stockQuantity = 10;
    int quantityToSell = 4;
    int newQuantity = 6;
    var productMock = new Mock<Product>(MockBehavior.Strict);
    productMock.SetupGet(p => p.StockQuantity).Returns(stockQuantity);
    productMock.SetupSet(p => p.StockQuantity = newQuantity);
    var classUnderTest = new SellBuyPipeLine();
    // Act
    test.SellGivenQuantityOfProduct(product, quantityToSell);
    // Assert
    productMock.VerifySet(p => p.StockQuantity, Times.Once());
}

您可以不使用,因为Product不包含任何逻辑,在这种情况下,只需实例化一个new Product并断言其StockQuantity等于newQuantity

除非Product类包含实际的业务逻辑,否则不要嘲笑它。我建议你在写测试的时候尽量装傻。

[TestMethod]
public void Can_Sell_Given_Quantity_Of_Single_Products_Stock_Quantity()
{
    var product = new Product { ArticleNr = 87, StockQuantity = 10 };
    var pipeline = new SellBuyPipeLine();
    pipeline.SellGivenQuantityOfProduct(product, 5);
    Assert.AreEqual(5, product.StockQuantity);
}

愚蠢的(非常简单的)测试会导致愚蠢的简单生产代码,而这正是您想要的。

尽可能避免对调用的mock和断言采取严格的行为,因为这些行为会使测试变得脆弱。