我们是否应该测试被调用函数的签名(包括传递的参数数量)?

时间:2018-09-24 16:55:55

标签: python unit-testing tdd

据我了解TDD,我们应该编写最少数量的测试以确保未能达到我们的代码目标,然后仅编写通过此类测试所需的代码。

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

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

1 个答案:

答案 0 :(得分:2)

  

我们应该编写最少数量的测试以确保未能达到我们的代码目标,然后仅编写通过此类测试所需的代码

这是正确的,但有一个重要的补充:您需要在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信息。