gpt4 book ai didi

unit-testing - 单元测试断言重复

转载 作者:行者123 更新时间:2023-12-04 23:31:13 25 4
gpt4 key购买 nike

我正在研究 TDD 并在我当前的项目中对其进行试验。
我注意到我必须在测试中复制很多断言。
这是情况:
我有一个带有两个构造函数的 Order 类,第一个是默认的,
第二个有三个参数

Order(int customerId, int typeId, decimal amount)

在 OrderTests 类中,我正在检查作业是否运行良好
Assert.IsTrue(o.CustomerId == 5 && o.TypeId == 3 && amount == 500)

由于订单创建是一个复杂的过程,我有带有以下创建订单方法的订单服务类。
Order CreateOrder(int cusotmerId, int typeId, int amount, moreParams...)

OrderServiceTests 类对此方法进行了测试,我需要使用相同的断言来检查是否在 CreateOrder 服务中正确创建了 Order。
Assert.IsTrue(o.CustomerId == 5 && o.TypeId == 3 && amount == 500)
  • 在测试中有这样的重复可以吗?
  • 在测试中提取具有相同断言的方法是否有意义,因为有时数量或重复的断言可能不止一个?或者这样的方法提取使测试不可读?
  • 最佳答案

    如果您有多种创建对象的方法,您可能希望针对每个创建方法(即参数化构造函数和工厂方法)测试对象的状态。因此,复制断言是有意义的。

    在通过测试后的重构期间(永远记住口头禅:红绿重构),如果您不仅在生产代码中而且在测试中发现重复,那么您应该通过例如删除它使用提取方法重构。

    [TestMethod]
    public void if_parametrized_ctor_is_called_then_state_should_be_accordingly {
    var order = new Order(customerId, ...);
    ObjectPropertiesShouldBeSetTo(order, customerId, ...);
    }

    [TestMethod]
    public void if_factory_method_is_called_then_state_should_be_accordingly {
    var order = myFactory.CreateOrder(customerId, ...);
    ObjectPropertiesShouldBeSetTo(order, customerId, ...);
    }

    // Extracted to remove code duplication
    public void ObjectPropertiesShouldBeSetTo(Order order, int customerId, ...) {
    Assert.AreEqual(customerId, order.CustomerId);
    Assert.AreEqual(...);
    }

    如果您像示例中那样在一个 Assert 语句中检查多个条件,事情就会变得复杂。它降低了测试的可读性,并且如果任一条件失败,可能很难找到原因。

    关于unit-testing - 单元测试断言重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4930742/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com