【问题标题】:How to mock a function inside a function python test?如何在函数 python 测试中模拟函数?
【发布时间】:2021-09-07 12:03:48
【问题描述】:

我有这些文件:

utils.py

def generateCode():
    while(True):
        # https://tools.ietf.org/html/rfc4122.html
        uuid_code = str(uuid.uuid4().int)[:6]
        return uuid_code

生成.py

from utils import generateCode

def create_auth_challenge():
   code = generateCode()
   return code

test.py

from unittest.mock import patch
from generate import create_auth_challenge

@patch('utils.generateCode', return_value='123456')
def test_create_auth_challenge(self, mock_generateCode):
   answer = create_auth_challenge()
   self.assertEqual(answer,'123456')

但问题是因为测试结果失败

answer!='123456'

所以,我认为这是因为模拟过程是错误的,因为答案值始终是随机数。是什么让它错了?是因为uuid4吗?如何进行正确的 mocking?

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    在您修补utils.generateCode 之前,文件generate.py 已经导入了原始utils.generateCode 并在本地将其分配为generateCode,因此更新的补丁不会反映。

    解决方案 1

    相反,在 generate.py 中模拟 generateCode 的本地版本。所以在你的 test.py 中改变它:

    @patch('utils.generateCode', return_value='123456')
    

    收件人:

    @patch('generate.generateCode', return_value='123456')
    

    解决方案 2

    如果您希望保留对源utils.generateCode 的修补,请在修补生效后才导入文件generate.py。因此,将您的 test.py 更改为:

    ...
    # from generate import create_auth_challenge  # Remove this import
    ...
    @patch('utils.generateCode', return_value='123456')
    def test_create_auth_challenge(mock_generateCode):
        from generate import create_auth_challenge  # Move the import here
        ...
    ...
    

    解决方案 3

    您还可以将 generate.py 更改为也从源 utils 使用它。因此,将您的 generate.py 更改为:

    import utils
    
    def create_auth_challenge():
       code = utils.generateCode()
       return code
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2021-09-10
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多