如何在我的django应用程序中模拟到达外部服务的组件?

时间:2018-05-03 22:41:37

标签: python django testing mocking

我有一个方法可以访问外部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)

但是我如何处理在我最终调用测试的方法中实例化类的情况?

1 个答案:

答案 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