В Django как смоделировать метод объекта, вызываемый views.py во время его импорта? - PullRequest
0 голосов
/ 10 апреля 2019

Я пишу Системные тесты для моего приложения Django, где я тестирую все приложение с помощью HTTP-запросов и проверяю API-интерфейсы его внешних зависимостей.

В views.py У меня есть что-то вроде:

from external_service import ExternalService
externalService = ExternalService
data = externalService.get_data()

@crsf_exempt
def endpoint(request):
    do_something()

То, что я хочу - это смоделировать (или заглушить) ExternalService, чтобы он возвращал предопределенный ответ, когда вызывается его метод get_data().

Проблема в том, что когда я запускаю python manage.py test, views.py загружается перед моим тестовым классом. Поэтому, когда я исправляю объект с помощью фиктивного объекта, функция get_data() уже была вызвана.

Это решение тоже не сработало.

1 Ответ

0 голосов
/ 10 апреля 2019

Прежде всего, не вызывайте ваш метод во время импорта.Это не может быть необходимым, конечно?

Если get_data делает что-то вроде get запроса, например,

def get_data():
    response = requests.get(DATA_URL)
    if response.ok:
        return response
    else:
        return None

Тогда вы можете высмеять его;

from unittest.mock import Mock, patch

from nose.tools import assert_is_none, assert_list_equal

from external_service import ExternalService


@patch('external_service.requests.get')
def test_getting_data(mock_get):
    data = [{
        'content': 'Response data'
    }]

    mock_get.return_value = Mock(ok=True)
    mock_get.return_value.json.return_value = data

    response = ExternalService.get_data()

    assert_list_equal(response.json(), data)


@patch('external_service.requests.get')
def test_getting_data_error(mock_get):
    mock_get.return_value.ok = False

    response = ExternalService.get_data()

    assert_is_none(response)

Для этого вам понадобится pip install nose, если у вас его еще нет.

...