Ответ клиента модульного теста 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()
Это была моя проблема. Надеюсь, это сработает...