我试图模拟一个函数,无论它是如何在代码中导入的。 我找不到有关如何操作的信息。
这是一个示例,第一个断言按预期工作,但第二个断言失败,因为路径:
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")
您必须将第二个测试修改如下:
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
。