Ответ клиента модульного теста Django имеет пустой контекст

У меня есть модульный тест, который терпит неудачу в утверждении, которое проходит в другом тесте в том же классе тестовых случаев.

Вот прохождение теста:

def test_home(self):
    c = Client()
    resp = c.get('/')
    self.assertEqual(resp.status_code, 200)
    self.assertTrue('a_formset' in resp.context)

Вот неудачный тест:

def test_number_initial_number_of_forms(self):
    c = Client()
    resp = c.get('/')
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1)

Во втором тесте получаю ошибку TypeError: 'NoneType' object has no attribute '__getitem__'.

Если я выполню второй тест как

def test_number_initial_number_of_forms(self):
    c = Client()
    resp = c.get('/')
    self.assertTrue('a_formset' in resp.context)
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1)

Я получаю ошибку TypeError: argument of type 'NoneType' is not iterable. Я подтвердил с помощью операторов печати во втором тесте, что response.content содержит страницу, которую я ожидаю получить, что код состояния правильный и что шаблон правильный. Но контекст ответа постоянно None во втором тесте.

Я запускаю свои модульные тесты Django через стандартный интерфейс "python manage.py test...", поэтому я не верю, что сталкиваюсь с "контекст пуст из оболочки".

Что происходит с этим?

Изменить:

Если я добавлю print type(resp.context['a_formset']) к каждому тесту, для рабочего теста я получу <class 'django.forms.formsets.AFormFormSet'>. Для нерабочего теста я снова получаю TypeError: 'NoneType' object has no attribute '__getitem__'.


person Melissa Avery-Weir    schedule 18.01.2013    source источник
comment
@sneawo Да, это набор форм.   -  person Melissa Avery-Weir    schedule 18.01.2013
comment
Как в рабочих, так и в нерабочих тестах временно добавьте строку print type(resp.context['a_formset']). Возможно, вы получите не то, что ожидаете.   -  person Evan Porter    schedule 18.01.2013
comment
@EvanPorter Добавил результаты к вопросу. Как и ожидалось (и к сожалению), я получил объект для рабочего теста и ошибку отсутствия атрибута для нерабочего теста. :-/   -  person Melissa Avery-Weir    schedule 19.01.2013
comment
Странно, что контекст будет None, если шаблон успешно отобразился с использованием этого контекста. PyCharm поддерживает отладку тестов Django, я бы использовал этот инструмент и установил точку останова в конце вашего представления, в любом промежуточном программном обеспечении, имеющем хук process_response(), и любых процессорах контекста шаблона, которые вы могли добавить, отслеживая контекст.   -  person mikewaters    schedule 20.01.2013


Ответы (2)


Сегодня столкнулся с той же проблемой. второй тест получает ту же страницу, в которой ничего нет в response.context

Я провел исследование и обнаружил, что 1) тестовый клиент использует сигналы для заполнения контекста, 2) мой метод просмотра не вызывается для второго теста.

Я включил отладчик и обнаружил, что виновато «промежуточное программное обеспечение кэша». Зная, что я нашел этот билет и этот ТАК вопрос (у последнего есть решение).

Итак, вкратце: второй запрос обслуживается из кеша, а не из представления, поэтому представление не выполняется, а тестовый клиент не получает сигнал и не имеет возможности заполнить контекст.

Я не могу отключить промежуточное программное обеспечение кэширования для своего проекта, поэтому я добавил следующие хак-строки в свои настройки:

if 'test' in sys.argv:
   CACHE_MIDDLEWARE_SECONDS = 0

Надеюсь, это поможет кому-то

person akava    schedule 19.06.2013

Это потому, что вы столкнулись с какой-то ошибкой, вышли из оболочки и перезапустили ее.

Но вы забыли запустить среду...

from django.test.utils import setup_test_environment
>>> setup_test_environment()

Это была моя проблема. Надеюсь, что это работает...

person Nabin    schedule 30.01.2014