如何使用 pytest-mock 修补函数,而不考虑用于调用它的路径/命名空间?

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

我试图模拟一个函数,无论它是如何在代码中导入的。 我找不到有关如何操作的信息。

这是一个示例,第一个断言按预期工作,但第二个断言失败,因为路径:

import mymodule
from mymodule import test1


def test_mock(mocker):
    mocker.patch('mymodule.test1', return_value="mocked")
    assert mymodule.test1() == "mocked"  # works
    assert test1() == "mocked"  # fails

一个相关问题,我将如何模拟第二个调用?如何指示当前工作空间?这不起作用:

mocker.patch('test1', return_value="mocked")

python mocking pytest-mock pytest-mock-patch
1个回答
0
投票

您必须将第二个测试修改如下:

with patch("__main__.test1", return_value="mocked_2"):
    assert test1() == "mocked_2"

在之前的测试中,我在测试文件的命名空间中模拟了名称

test1

所以我的测试代码(保存在文件中

test_module.py
)如下:

import unittest
from unittest.mock import patch
import mymodule
from mymodule import test1

class MyTestCase(unittest.TestCase):

    def test_mock(self):

        # this is your working test
        with patch('mymodule.test1', return_value="mocked"):
            print("Test 1")
            assert mymodule.test1() == "mocked"  # works

        # THIS IS YOUR SECOND NOT WORKING TEST CHANGED TO WORK
        with patch("__main__.test1", return_value="mocked_2"):
            print("Test 2")
            assert test1() == "mocked_2"

        # ... here I have not used MOCKING
        print("Test 3")
        assert test1() == "real test1 function"

if __name__ == '__main__':
    unittest.main()

我已将您的生产代码保存在文件中

mymodule.py
,其内容只是函数
test1()
:

def test1():
    return "real test1 function"

注意:我没有使用过

pytest
;我只使用了模块
unittest

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