Как проверить функцию, которая что-то возвращает и имеет побочный эффект? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть функция, которая возвращает что-то, но в то же время имеет побочный эффект.Должен ли я проверять только значение, которое возвращает эта функция, или мне тоже нужно проверить результат побочного эффекта?

@slack_interactions.on('admin_add')
def handle_admin_add(payload):
    team_id = payload['team']['id']
    user_id = payload['user']['id']
    action_value = payload['actions'][0]['selected_options'][0]['value']

    user = SlackUser.objects.find_by_ids(team_id, action_value)

    if user and not user.is_bot:
        user.make_admin()

    return build_admins_message(team_id, user_id)

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Короткий ответ, протестируйте оба.

Длинный ответ: Вы всегда должны помнить, что тестирование подтверждает, что для данного входа вы ожидаете определенного выхода .

Спомните, что если ваша функция изменяет состояние (побочный эффект), вам необходимо убедиться, что состояние изменено, как и ожидалось.Если он также возвращает значение, вам необходимо убедиться, что возвращаемое значение соответствует ожидаемому.

Тестирование - это отличный способ убедиться, что ваш код устойчив, если вы понимаете дзен за ним. Я должен проверить то, что ожидаю, и спроектировать тест для неожиданного.

Однако один только тест не дает хорошего кода, если у вас есть метод, который выполняет более двух вещей, он можетбудь то, что не правильно разработан.обычно методы, которые влияют на состояние, не должны возвращать значения, а наоборот.Это не в камне, но если вы следуете этому соглашению, легче разъединить ваши системы.

Существуют принципы кодирования, которые предотвращают будущие головные боли, одним из них является принцип единой ответственности.Что в этом случае ваша функция явно нарушает.Я рекомендую вам взглянуть на SOLID принципы программирования, оно того стоит, поверьте мне.Модульное тестирование станет естественным, как только вы их примете.

0 голосов
/ 28 декабря 2018

Я бы порекомендовал протестировать и то и другое, поскольку и побочный эффект, и возвращаемое значение являются частью поведения функций и частью интерфейса, взаимодействующего с вашим кодом.

Для достижения этого вы можете использовать библиотеку насмешек, напримервстроенный unittest.mock , таким образом, вы можете посмеяться над вызовом user.make_admin () и всего объекта SlackUser.

Предлагаю прочитать документацию MagicMock и патч для упрощения тестирования.

Счастливого тестирования!

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