исправить мою функцию на случайную функцию randint - PullRequest
1 голос
/ 17 марта 2019

У меня есть функция для генерации sms_token.Он не должен дублироваться с существующим в базе данных.Однако пространство токена может быть не таким большим, как могло бы произойти столкновение более нового.

Python 3.7.0

from random import randint

from multy_herr.user_profiles.models import UserProfile


def rand_six():
    """
    Must find the `sms_token` which no `UserProfile`
    :return:
    """
    tmp = ""
    for i in range(6):
        tmp += str(randint(0, 9))
    if 0 == UserProfile.objects.filter(sms_token=tmp).count():
        return tmp
    else:
        return rand_six()

Поэтому я хочу сделать side_effect из randint чтобы вернуть мне детерминированные значения по этому порядку 123456, 123456, 111222

С заданными значениями.Я смогу проверить else логику в моем rand_six

Я пробовал этот ответ , но не работает.rand_six() все еще возвращает мне оригинальную функцию, а не ту, которую я сделал.

from unittest.mock import patch
from multy_herr.users.utils import rand_six

    @patch('random.randint')
    def test_rand_six(self, some_func):
        """
        Suppose it generates the duplicated `sms_token`
        :return:
        """
        some_func.return_value = '123456'
        assert '123456' == rand_six()

Проблема:

Она не исправляет поведение random.randint

Вопрос:
Как я могу поместить свой поддельный сгенерированный список в мой randint?

1 Ответ

1 голос
/ 17 марта 2019

Спасибо Klaus D. за его комментарий.Я должен придерживаться module.

  1. Использование import random и random.randint(0, 9)
import random

from multy_herr.user_profiles.models import UserProfile


def rand_six():
    """
    Must find the `sms_token` which no `UserProfile`
    :return:
    """
    tmp = ""
    for i in range(6):
        tmp += str(random.randint(0, 9))
    if 0 == UserProfile.objects.filter(sms_token=tmp).count():
        return tmp
    else:
        return rand_six()
Используйте global, чтобы получить мое определенное значение с заданным условием.И немного обманывают с моим собственным вопросом.Поскольку я хочу, чтобы 2 ответа были одинаковыми, но не последними.
    def _rand111(self, a, b):
        global idx
        if idx in range(12):
            idx += 1
            return 1
        else:
            return 2

    def test_mock_randint(self):
        """
        Test mock the behaviour of `random.randint`
        :return:
        """

        with mock.patch('random.randint', self._rand111):
            assert '111111' == rand_six()
            assert '111111' == rand_six()
            assert '222222' == rand_six()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...