Могу ли я использовать часть реализации для построения тестового ожидания? - PullRequest
0 голосов
/ 03 января 2019

Предположим, что я много раз использую build_help_message в своем приложении, и он возвращает большой словарь, содержащий text и attachments, который мне нужно отправить с использованием библиотеки Client.

Можно ли использовать build_help_message для получения ожидаемого результата в тесте? Как я могу избежать этого, если это не очень хорошая практика?

def help_handler(payload):
    team_id = payload['team_id']
    user_id = payload['user_id']

    message = build_help_message(team_id, user_id)

    Client(team_id).send_message(user_id, **message)

Тесты

class TestHandler(TestCase):
    def setUp(self):
        team = Team.objects.create(team_id='TEAMID')
        User.objects.create(team=team, user_id='USERID')

    def tearDown(self):
        ...

    @mock.patch('client.Client.send_message')
    def test_correct_text(self, send_message_mock):
        payload = {'team_id': 'TEAMID', 'user_id': 'USERID'}

        handle_message(payload)

        expected_message = build_help_message('TEAMID', 'USERID')

        send_message_mock.assert_called_with('USERID', **expected_message)

1 Ответ

0 голосов
/ 03 января 2019

Ну, повторная реализация build_help_message в вашем тесте определенно не лучше. То, что вы могли бы сделать (и что здесь могут порекомендовать пуристы unittest), это переписать help_handler, чтобы вы могли внедрить зависимость build_message, то есть:

def help_handler(payload, build_help_message=build_help_message):
    team_id = payload['team_id']
    user_id = payload['user_id']

    message = build_help_message(team_id, user_id)

    Client(team_id).send_message(user_id, **message)

, а затем и насмешку build_message - но пуристы юнит-теста также хотели бы, чтобы вы сделали то же самое с Client (вместо использования Mock) в любом случае.

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

Для вашего примера, насколько мне известно, без контекста (всегда сложно принять обоснованное решение, не зная проекта), я действительно не стал бы беспокоиться о том, чтобы делать что-то большее - кроме, конечно, юнит-тестирования build_help_message тоже, но я предполагаю, что это уже так; -)

...