Представления Monkeypatch с помощью LiveServerTestCase от Django

Я пытаюсь написать тесты для внешнего интерфейса моего приложения, используя Selenium. Однако страницы, которые я пытаюсь протестировать, получают свои данные от Solr, и я не хочу запускать экземпляр Solr для запуска тестов.

Я использую py.test и py.test-django свои тесты, и я Я пытаюсь обезвредить представления, чтобы делать утверждения о данных, отправленных браузером Selenium.

Например, это тест, который я ожидаю провалить:

def test_search(self, live_server, browser, monkeypatch):
    def mockview(request):
        from django.http import HttpResponse
        assert True == False
        return HttpResponse('Test')

    monkeypatch.setattr(project.app.views, 'search', mockview)

    browser.get(live_server.url + reverse('app:search'))

Я ожидаю, что это не удастся, когда браузер попытается загрузить страницу «приложение: поиск». Вместо этого он загружает обычную версию страницы, и тест проходит успешно.

Есть ли способ получить такое поведение? Или есть лучший способ приблизиться к этим тестам?


person rouge8    schedule 27.02.2013    source источник


Ответы (1)


Вы обезьяна, исправляющая функцию просмотра в модуле просмотра. Любое местоположение, которое уже импортировало это представление (ссылку на функцию), по-прежнему будет содержать ссылку на старую (настоящую) функцию представления.

Механизм urlconf Django импортирует и настраивает себя с реальным представлением по первому запросу (что, вероятно, происходит в другом тестовом примере).

Когда вы измените функцию в своем модуле представлений, urlconf этого не заметит, так как он уже содержит ссылку на старую функцию представления. Исправление Monkey в Python изменяет имена/ссылки, а не сами функции.

Вы используете помощник pytest monkeypatch, но это руководство в документации по фиктивной библиотеке содержит полезную информацию о том, где применять патчи для обезьян:

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

В этом конкретном случае, я думаю, лучше всего исправить Sorl-вызов со статическими тестовыми данными, а не с представлением. Поскольку вы делаете тест Selenium, я думаю, было бы очень хорошо сохранить реальный вид. Что вы на самом деле тестируете, если заменяете все представление?

Если само представление содержит много специфичного для Sorl кода, вы можете разбить этот код на отдельную функцию, которую затем можно будет легко исправить.

Если вы действительно хотите изменить представление, я предлагаю вам переопределить urlconf, чтобы он указывал на ваше новое представление: https://pytest-django.readthedocs.org/en/latest/helpers.html#pytest-mark-urls-override-the-urlconf

person andreaspelme    schedule 04.03.2013
comment
Представления, которые я заменю, представляют собой представления JSON, извлекаемые JS на стороне клиента, но исправление вызовов Solr также работает. - person rouge8; 06.03.2013
comment
mock теперь является частью Python 3, поэтому вы можете заменить первую ссылку на docs.python.org/3/library/unittest.mock.html#where-to-patch - person Flimm; 28.12.2016