Правильный способ проверки функции - PullRequest
0 голосов
/ 02 января 2019

Можно ли вызывать build_admins_message в тестах, чтобы получить ожидаемый результат, который будет использоваться в фиктивном утверждении?

Реализация:

@slack_messages.on_pattern('(?i)^admins$')
def handle_admins_message(event, body, match):
    team_id = event['team_id']
    user_id = body['user']

    message = build_admins_message(team_id, user_id)
    Slack(team_id).send_message(user_id, **message)

Тесты:

class TestAdminsMessageHandler(TestCase):
    def setUp(self):
        team = SlackTeam.objects.create(team_id='TEAMID')
        SlackUser.objects.create(team=team, user_id='USERID')

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

    @mock.patch('slango.slack.Slack.send_message')
    def test_correct_text(self, send_message_mock):
        event = {
            'team_id': 'TEAMID',
            'event': {
                'text': 'admins',
                'user': 'USERID'
            }
        }

        handle_admins_message(event, event['event'])

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

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

Реализация build_admins_message:

def build_admins_message(team_id, user_id):
    user = SlackUser.retrieve(team_id, user_id)
    admins = SlackUser.objects.filter(
        is_bot_admin=True, team__team_id=team_id).order_by(
            'real_name', 'display_name')

    attachments = []
    if user.is_bot_admin:
        attachments.append(build_admin_picker())

    for admin in admins:
        attachments.append(build_admin_item(user, admin))

    attachments.append(build_admin_more())

    return {
        'text': "Here is users with admin rights:",
        'attachments': attachments
    }

1 Ответ

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

Это будет зависеть от роли build_admins_message в вашей программе.

Поскольку разные части программы должны создавать сообщение одинаково, это, вероятно, нормально. Подумайте, можете ли вы сделать более явным то, что build_admins_message используется следующим образом, например, с внедрением зависимости. Убедитесь, что ваш вспомогательный метод имеет свой собственный тест. (Я обычно вижу использование patch как запах дизайна, но помните, что это автоматически не означает, что что-то не так!)

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

...