Нужно ли использовать макеты? - PullRequest
0 голосов
/ 02 января 2019

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

Вопрос в том, как ее проверить?Нужно ли имитировать make_admin и build_admins_message и проверять, вызваны ли они, или мне нужно тестировать реальные реализации?Например, я могу извлечь пользователя из базы данных и убедиться, что он действительно является администратором, а также проверить, что build_admins_message возвращает словарь, который я ожидаю получить.

@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)

В настоящее время мои тесты выглядят так:

class TestAdminAddHandler(TestCase):
    def setUp(self):
        team = SlackTeam.objects.create(team_id='TEAMID')
        SlackUser.objects.create(team=team, user_id='USERID')
        SlackUser.objects.create(team=team, user_id='BOTID', is_bot=True)
        SlackUser.objects.create(
            team=team, user_id='ADMINID', is_bot_admin=True)

    def tearDown(self):
        SlackUser.objects.all().delete()
        SlackTeam.objects.all().delete()

    def test_wrong_callback(self):
        payload = {'callback_id': 'wrong_callback'}
        message = handle_admin_add(payload)
        self.assertIsNone(message)

    def test_has_no_user(self):
        payload = {
            'callback_id': 'admin_add',
            'team': {'id': 'TEAMID'},
            'user': {'id': 'ADMINID'},
            'actions': [{
                'selected_options': [{'value': 'BADID'}]
            }]
        }

        message = handle_admin_add(payload)

        user = SlackUser.objects.get(user_id='USERID')
        self.assertFalse(user.is_bot_admin)

        for att in message['attachments']:
            self.assertNotIn('BADID', att.get('title', ''))

    def test_user_is_bot(self):
        payload = {
            'callback_id': 'admin_add',
            'team': {'id': 'TEAMID'},
            'user': {'id': 'ADMINID'},
            'actions': [{
                'selected_options': [{'value': 'BOTID'}]
            }]
        }

        message = handle_admin_add(payload)
        user = SlackUser.objects.get(user_id='BOTID')
        self.assertFalse(user.is_bot_admin)

        for att in message['attachments']:
            self.assertNotIn('BOTID', att.get('title', ''))

    def test_add_admin(self):
        payload = {
            'callback_id': 'admin_add',
            'team': {'id': 'TEAMID'},
            'user': {'id': 'ADMINID'},
            'actions': [{
                'selected_options': [{'value': 'USERID'}]
            }]
        }

        message = handle_admin_add(payload)

        user = SlackUser.objects.filter(user_id='USERID').first()
        self.assertTrue(user.is_bot_admin)

        user_in_list = False
        for att in message['attachments']:
            if 'USERID' in att.get('title', ''):
                user_in_list = True

        self.assertTrue(user_in_list)

1 Ответ

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

Проблема здесь двоякая.Во-первых, вы должны убедиться, что ваш код будет правильно работать с работающим сервером Slack - как вы уже поняли, mock будет хорошим способом сделать это, потому что модульные тесты должны быть полностью автономными.Вы также можете написать макеты, чтобы эмулировать поведение некорректно функционирующего сервера.

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

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

Модульные тесты должны проверять работу одного компонента и не должны полагаться на какие-либо внешние сервисы.Интеграционные тесты проверяют, что код функционирует правильно в сочетании с другими компонентами, и, как правило, будут выполняться только после проверки целостности отдельных компонентов.

Тестирование - очень большая тема, поэтому я надеюсь, что это ответ на ваш вопрос.

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