Как мне сменить компонент в моем приложении django, который обращается к внешнему сервису? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть метод, который обращается к внешнему 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 голосов
/ 04 мая 2018

Если у вас был модуль Python 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')

В модульном тестировании лучше всего каким-либо образом смоделировать все внешние сервисы, чтобы вы тестировали модуль, то есть тестируемую функцию, и ничего больше.

Другой способ сделать это - использовать функцию patch в стандартной библиотеке модульного тестирования.

https://docs.python.org/3/library/unittest.mock.html#attaching-mocks-as-attributes

>>> with patch('animals.ExternalService') as MockClass:
...     MockClass.get_candidate_validity.return_value = 'foo'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...