据我了解TDD,我们应该编写最少数量的测试以确保未能达到我们的代码目标,然后仅编写通过此类测试所需的代码。
但是,是否也应该将对调用函数签名的测试(包括对传递的非关键字和关键字参数的数量(例如Python的*args
和**kwargs
)进行测试,也应该纳入我们的测试套件中?
例如,如果我们有一个调用外部API的函数,该函数可能接受许多带有许多默认值的参数,那么我是否测试我们是否按预期准确地调用了此类API(包括不传递不必要的参数或检查是否传递)是有意义的没有关键字标记,因为我们除了默认选项外不需要其他任何东西)?
答案 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
信息。