如何模拟我正在测试的函数内部调用的函数?

问题描述 投票:0回答:1

我的文件结构是这样的:

pytests/
├── moduleA/
│   ├── functions/
│   │   └── process_moduleA.py
│   └── test_process_moduleA.py
└── utils/
    └── archive.py
    

在process_moduleA中,我有正在测试的功能:

def arch():
    archive_process(
            param1, param2
        )

我的测试函数是这样的:

from pytests.utils.archive import archive_process

@patch('pytests.utils.archive.archive_process')
def test_arch(mock_archive_proc):

    arch()
    mock_archive_proc.assert_called_once()

我只是尝试创建函数的模拟并检查该函数是否已被调用一次的最基本示例。但是,该函数永远不会被模拟,并且它会运行实际的函数。因此,模拟永远不会被调用。

我尝试过使用:

mock_archive=mocker.patch.object(pytests.utils.archive, 'archive_process', return_value=mock_archive_response) 

然后检查mock_archive是否被断言,但它也不起作用。我也尝试过使用补丁装饰器,但我遇到了同样的问题。

python unit-testing testing mocking pytest
1个回答
0
投票

模块加载时,

arch
在补丁出现之前定义。 在这种情况下,我建议使用依赖注入而不是模拟。 但是,要成功模拟,您可以尝试在补丁发生后重新加载模块。

import importlib from pytests.utils.archive import archive_process def test_arch(mock_archive_proc): with patch('pytests.utils.archive.archive_process') as mock_process: importlib.reload(process_moduleA) arch() mock_archive_proc.assert_called_once()

© www.soinside.com 2019 - 2024. All rights reserved.