Ответ клиента модульного теста 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. Я подтвердил через заявления печати во втором тесте, что ответ.содержимое содержит страницу I ожидайте получить, что код состояния правильный, и что шаблон правильный. Но контекст ответа последовательно None во втором тесте.

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

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

Edit:

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

2 ответов


сегодня я сталкиваюсь с той же проблемой. The второй test получает ту же страницу, не имеет ничего в ответ.контекст

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

Я включил отладчик и обнаружил, что виновным является "промежуточное ПО кэша". Зная, что я нашел этот билет и и (у последнего есть решение).

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

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

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

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


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

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

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

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