Лучший подход для проверки функции - PullRequest
0 голосов
/ 06 декабря 2018

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

@slack_messages.on_pattern('(?i)^help$')
def handle_help_message(event, body, match):
    message = build_help_message()
    Slack(event['team_id']).send_message(body['user'], **message)

def build_help_message():
    text = "Hello"

    return {
        'text': text,
        'attachments': [
            build_basics(),
            build_controls()
        ]
    }

Я написал этот тест, но он выглядит слишком сложным для такой простой функции.Как мне упростить мой тест?

class TestMesssageHandlers(TestCase):
    @mock.patch('slango.slack.Slack.send_message')
    @mock.patch('slango.slack.Slack.__init__')
    @mock.patch('apps.slackapp.help.handlers.build_help_message')
    def test_handle_help_message(self, build_message_mock, init_mock,
                                 send_message_mock):
        init_mock.return_value = None
        build_message_mock.return_value = {
            'text': mock.sentinel.text,
            'attachments': mock.sentinel.attachments
        }

        event = {
            'team_id': 'TEAMID',
            'event': {
                'text': 'help',
                'user': 'U111111'
            }
        }

        handle_help_message(event, event['event'])

        init_mock.assert_called_with(event['team_id'])
        send_message_mock.assert_called_with(
            event['event']['user'], **build_message_mock.return_value)

1 Ответ

0 голосов
/ 05 февраля 2019

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

Однако вы не найдете этих ошибок с ложными ссылками.класса Slack: представьте, что правильные именованные аргументы метода send_message не text и attachments, а txt и attach - с вашими насмешками вы никогда не заметите эту проблему, потому что ваши издевательства отражаютваше (неправильное) понимание того, как работают другие компоненты.

Вывод таков: для этого вида кода модульное тестирование - это не правильный подход, а интеграционное тестирование.Если вам нужно больше примеров, вы также можете взглянуть на эти вопросы, которые идут в похожем направлении: Макет серии взаимозависимых вызовов или Должны ли модульные тесты тестироваться на соответствие API REST? .

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