【问题标题】:Should we test for called functions signatures (including number of passed arguments)?我们应该测试被调用函数的签名(包括传递参数的数量)吗?
【发布时间】:2018-09-24 16:55:54
【问题描述】:

就我对 TDD 的理解而言,我们应该编写最少数量的测试来满足我们的代码目标,然后只编写通过这些测试所必需的代码。

但是,对调用函数签名的测试,包括对传递的非关键字和关键字参数的数量(如 Python 的 *args**kwargs)的测试,是否也应该纳入我们的测试套件中?

例如,如果我们有一个调用外部 API 的函数,它可能需要许多参数和许多默认值,我想我们是否测试我们是否按预期准确调用此类 API 是有意义的(包括不传递不必要的参数或检查我们是否通过没有关键字标志,因为除了默认选项我们不需要任何其他东西)?

【问题讨论】:

    标签: python unit-testing tdd


    【解决方案1】:

    我们应该编写最少数量的测试来满足我们的代码目标,然后只编写通过这些测试所必需的代码

    这是正确的,但有一个重要的补充:您需要在 TDD 的每次迭代中执行此操作。所以最终结果(经过多次迭代)不一定是小而简单的。你用小步骤创造大东西。

    在您描述函数的本质的情况下,根据输入参数调用具有正确参数的外部 API。如果您使用 TDD 创建它,则测试将向您的函数提供一些参数并检查是否调用了外部 API。

    你会从简单的东西开始创建你的函数,然后让它变得更复杂。假设您正在调用外部 API 来处理在线存储应用程序中的付款。

    您可以从以下内容开始:

    def test_payment():
        order_processor.external_api = Mock()
    
        order = Order(items=Item(quantity=10, price=10))
        order_processor.process(order)
    
        assert_that(order_processor.external_api.process_payment, called_with(amount=100))
    

    然后你实现OrderProcessor.process 仅将amount 传递给`process_payment。

    TDD 的下一个迭代是添加买家信息:

    def test_payment():
        order_processor.external_api = Mock()
    
        order = Order(
            items=Item(quantity=10, price=10),
            buyer=Buyer(id=567)
        )
        order_processor.process(order)
    
        assert_that(
          order_processor.external_api.process_payment,
          called_with(amount=100, payer=buyer.id))
    

    然后你修改process来传递buyer信息。

    【讨论】:

      猜你喜欢
      • 2019-10-15
      • 1970-01-01
      • 2012-04-25
      • 2021-08-26
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多