Должны ли мы проверять сигнатуры вызываемых функций (включая количество переданных аргументов)? - PullRequest
0 голосов
/ 24 сентября 2018

Насколько я понимаю, TDD, мы должны написать минимальное количество тестов, чтобы не достичь цели нашего кода, а затем написать только код, необходимый для прохождения таких тестов.

Однако, выполняется тестирование для сигнатур вызываемых функций,включая тестирование на количество переданных аргументов без ключевых слов и слов (таких как Python * *args и **kwargs), также должны быть включены в наш набор тестов?

Например, если у нас есть функция, вызывающая внешнийAPI, который может принимать множество аргументов со многими значениями по умолчанию, я думаю, имеет смысл, проверяем ли мы, что мы вызываем такой API точно по назначению (включая передачу не большего количества аргументов, чем необходимо, или проверку, что мы не передаем ни один из ключевых слов, так как нам ничего не нужнопараметры по умолчанию)?

1 Ответ

0 голосов
/ 24 сентября 2018

мы должны написать минимальное количество тестов, чтобы не достичь цели нашего кода, а затем написать только код, необходимый для прохождения таких тестов

Это правильно, но с одним важным дополнением: вам нужносделайте это на каждой итерации 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 информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...