Как подружиться с функцией, возвращающей некоторое значение

Мне нужно протестировать сохранение кода подтверждения в кэш Redis.

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

Это мой взгляд

def post(self, request):
    serializer = ReviewerSignUpSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)

    phone = serializer.validated_data.get("phone")
    confirmation_code = get_confirmation_code()
    cache.set(
        key=str(phone),
        value=confirmation_code,
        timeout=settings.CONFIRMATION_CODE_LIFETIME
    )

    send_sms_task.apply_async([confirmation_code, str(phone)])

Это функция, которая генерирует код подтверждения

def get_confirmation_code() -> str:
    seq = list(map(lambda x: str(x), range(10)))
    shuffle(seq)
    code = choices(seq, k=settings.INVITE_CODE_LENGTH)
    return "".join(code)

Тестовая функция

def test_saving_confirmation_code_in_cache(self, client, cache):
    phone = "+79389999999"
    generated_code = "9999"
    with patch("api.v1.authentication.utils.get_confirmation_code", return_value=generated_code):
        client.post(reverse('api:v1:signup'), data={'phone': phone})

    confirmation_code = cache.get(str(phone))
    assert confirmation_code is not None
    assert confirmation_code == generated_code

Возможно, мне нужно протестировать всю функцию просмотра?

Вы должны исправить функцию в файле views.py

Я предполагаю, что класс APIView в вашей кодовой базе находится внутри api.v1.authentication.views

with patch("api.v1.authentication.views.get_confirmation_code", return_value=generated_code):
        client.post(reverse('api:v1:signup'), data={'phone': phone})

Спасибо всем! Моя ошибка в том, что я не указал, что функция get_confirmation_code импортируется из другого модуля.

Чтобы решить проблему, мне пришлось перенести эту функцию в APIView. После этого все заработало

def _get_confirmation_code(self) -> str:
    seq = list(map(lambda x: str(x), range(10)))
    shuffle(seq)
    code = choices(seq, k=settings.INVITE_CODE_LENGTH)
    return "".join(code)

def post(self, request):
    serializer = ReviewerSignUpSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)

    phone = serializer.validated_data.get("phone")
    confirmation_code = self._get_confirmation_code()
    cache.set(
        key=str(phone),
        value=confirmation_code,
        timeout=settings.CONFIRMATION_CODE_LIFETIME
    )

    send_sms_task.apply_async([confirmation_code, str(phone)])

def test_saving_confirmation_code_in_cache(self, client, cache):
    phone = "+79389999999"
    generated_code = "9999"
    with patch(
            "api.v1.authentication.views."
            "ReviewerSignUpView._get_confirmation_code",
            return_value=generated_code
    ):
        client.post(reverse('api:v1:signup'), data={'phone': phone})

    confirmation_code = cache.get(str(phone))
    assert confirmation_code is not None
    assert confirmation_code == generated_code
Вернуться на верх