我想模拟某个方法中使用的函数。此功能位于其他模块中。
我该怎么做?
尝试了此选项,但是它不起作用。
SomeClass().foo()
我希望mock_return()
在my_function()
内部执行我的whereJsonContains()
。
答案 0 :(得分:1)
您可以将unittest.mock.patch
或pytest-mock
插件与mocker
固定装置一起使用。
pack/another_pack.py
:
from pack import utils
class SomeClass:
def foo(self):
return utils.my_function()
pack/utils.py
:
def my_function():
return 'original'
import pytest
from unittest.mock import patch
from pack.another_pack import SomeClass
# Replace my_function with another function. You could pass parameters
# to the mocked function and handle them in the replacement.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_replace(attr):
def mock_return():
return attr
with patch("pack.another_pack.utils.my_function", new=mock_return):
assert SomeClass().foo() == attr
# If you just want to override the return value.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_return_value(attr):
with patch("pack.another_pack.utils.my_function") as my_func:
my_func.return_value = attr
assert SomeClass().foo() == attr
# With the pytest-mock plugin and the mocker fixture instead of unittest.mock.
@pytest.mark.parametrize("attr", ["a", "b", "c"])
def test_mock_plugin(attr, mocker):
my_func = mocker.patch("pack.another_pack.utils.my_function")
my_func.return_value = attr
assert SomeClass().foo() == attr
请注意,在所有测试中,patch
的第一个参数是要在其中模拟函数(pack.another_pack
)的模块的名称,以及函数名称在模块中的显示方式( utils.my_function
。
my_function
是针对整个pack.another_pack
模块的模拟。