将我的函数修补为随机randint函数

时间:2019-03-17 16:30:55

标签: python unit-testing mocking

我有一个生成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的逻辑

我已经尝试过此answer,但没有用。 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 个答案:

答案 0 :(得分:1)

感谢state的评论。我必须坚持使用 import React, { Component } from 'react'; import { Text, View } from 'react-native'; import { Subscribe } from 'unstated'; import LoginContainer from './containers/login-container'; export default class Login extends Component { constructor(props){ super(props) } render() { return ( <Subscribe to={[LoginContainer, AnotherContainer]}> {(container, another) => ( <View> <Text>{container.state.stepNumber}</Text> </View> }) </Subscribe> ); } }

  1. 使用Klaus D.module
import random
  1. 使用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()