我对单元测试的模拟有点陌生。
我有一些这样的代码:
在 foo/bar/baz.py 中,我有 2 个要模拟的函数,一个调用另一个:
def function1_to_mock():
.
.
.
def function2_to_mock():
function1_to_mock()
在 foo/bar/main.py 中,我导入其中 1 个并调用它:
from .baz import function2_to_mock
def some_function():
function1_to_mock()
.
.
.
我想模拟 function1_to_mock 和 function2_to_mock
在我的测试中我这样做:
def function1_to_mock(kid):
return MOCKED_VALUE
@pytest.fixture(autouse=True)
def mock_dependencies():
with patch(foo.bar.baz.function1_to_mock') as mock_function1_to_mock, \
patch('foo.bar.main.function2_to_mock') as mock_function2_to_mock:
mock_function2_to_mock.return_value = {
'this': 'that
}
yield mock_function1_to_mock, mock_function2_to_mock
def test_main(mock_dependencies):
some_function()
当 some_function 被调用时,真正的 function1_to_mock 和 function2_to_mock 被调用,而不是我的模拟。
有人可以让我知道如何正确模拟这两个函数吗?
我修改了你的代码,但我没有使用
pytest
,而只使用了模块unittest
。
你的baz.py
文件已经变成(离你不远:我只添加了print
指令):
def function1_to_mock():
print("REAL function1")
def function2_to_mock():
print("REAL function2")
function1_to_mock()
在您的
main.py
中,我仅更改了import
指令,如下所示:
from baz import function2_to_mock
def some_function():
function2_to_mock()
我已经在文件夹
test.py
中创建了文件foo/bar/test.py
:
from main import some_function
import unittest
from unittest.mock import patch
def f1_mock():
print('F1_MOCKED')
def f2_mock():
print('F2_MOCKED')
class MyTestCase(unittest.TestCase):
def test_main(self):
with patch('baz.function1_to_mock') as mock_function1_to_mock:
with patch('main.function2_to_mock') as mock_function2_to_mock:
mock_function1_to_mock.side_effect = f1_mock()
mock_function2_to_mock.side_effect = f2_mock()
some_function()
def test_main_real_func(self):
some_function()
if __name__ == '__main__':
unittest.main()
我的系统中执行的输出如下:
F1_MOCKED
F2_MOCKED
REAL function2
REAL function1
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
之前的输出显示测试方法
test_main()
调用了模拟函数f1_mock()
和f2_mock()
。side_effect
而不是 return_value
。