我有一个类ProductionClass
,其中包含一个要测试的方法method_to_test
。类ProductionClass
依赖于api
,我想在测试中模拟它。
from my_module.apis import api
class ProductionClass:
def method_to_test:
data = api.method_to_mock()
api.method_to_check_call(data)
测试代码如下:对于api
,我有一个模拟类MockApi
,我通过在@patch
装饰器中引用它来使用它。
from unittest.mock import patch, MagicMock
class MockApi:
def method_to_mock():
return some_mock_data
def method_to_check_call(data):
pass
class TestClass:
@patch('my_module.apis.api', MagicMock(return_value=MockApi()))
def test_check_called_with(self):
from module_of_class_production_class.ProductionClass import method_to_test
mock_api = MockApi()
method_to_test()
some_data = { ... }
mock.method_to_check_call.assert_called_with(some_data)
问题是它不起作用,因为mock_api
与@patch
装饰器中提供的MockApi
实例不同。有更好的方法来测试吗?
我还没有对此进行测试,但我认为您的补丁对象将作为第一个参数传递给test_check_called_with
,如下所示:
@patch('my_module.apis.api', MagicMock(return_value=MockApi()))
def test_check_called_with(self, your_magic_mock):
# Rest of code
您也可以使用with
构造,如下所示:
def test_check_called_with(self):
my_api = MockApi()
with patch('my_module.apis.api', MagicMock(return_value=my_api)) as my_mock_api:
# Your code here
您可以在此处查看官方python文档以了解更多详细信息:https://docs.python.org/3/library/unittest.mock.html#quick-引导