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

2024-05-23 18:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

就我所了解的TDD而言,我们应该编写最少数量的测试来达到代码的目标,然后只编写通过这些测试所必需的代码。你知道吗

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

例如,如果我们有一个调用外部API的函数,该函数可能会使用许多默认参数,那么我想我们是否测试我们是否完全按照预期调用此类API是有意义的(包括不传递多余的参数,或者检查我们不传递任何关键字标志,因为我们不需要除了默认选项以外的任何东西)?你知道吗


Tags: 函数代码api目标参数数量套件标志
1条回答
网友
1楼 · 发布于 2024-05-23 18:25:29

we should write minimum amount of tests to fail meeting our code's goal and then write only the code necessary to pass such tests

这是正确的,但有一个重要的补充:您需要在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到“处理支付”。你知道吗

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信息。你知道吗

相关问题 更多 >