我有一个方法可以访问外部API并提取一些内容,然后它执行一些逻辑并继续。问题是,在测试时,我不希望我的测试用例触发这个外部API,但我确实希望它模拟响应。实施例
def create_animals(candidate):
if ExternalService.get_candidate_validity(candidate):
print('Things are good, go ahead')
#creates the animal objects etc....
但ExternalService.get_candidate_validity
扩展到我想要模拟的API。我知道我可以模拟实例,如果它是这样的:
get_candidate_validity_value = {'response': True}
c = ExternalService('someparamsthatineed')
c.get_candidate_validity = MagicMock(return_value=get_candidate_validity_value)
但是我如何处理在我最终调用测试的方法中实例化类的情况?
答案 0 :(得分:3)
如果你有一个python模块<center>
,那就是:
animals.py
你会在def create_animals(candidate):
if ExternalService.get_candidate_validity(candidate):
print('Things are good, go ahead')
#creates the animal objects etc....
test_animals.py
单元测试中的最佳做法是以某种方式模拟所有外部服务,以便您对单元进行测试,即正在测试的功能,而不是其他任何内容。
另一种方法是使用标准单元测试库中的from mock import MagicMock # or import mock from stdlib unittest in python 3
def test_create_animals():
from path.to.animals import ExternalService, create_animals
ExternalService.get_candidate_validity = MagicMock(return_value=True)
animals = create_animals('foo')
ExternalService.get_candidate_validity.assert_called_with('foo')
功能。
https://docs.python.org/3/library/unittest.mock.html#attaching-mocks-as-attributes
patch