Django单元测试客户端响应有空上下文

Mel*_*eir 13 python django django-unittest

我有一个单元测试,它在一个断言中失败,该断言在同一测试用例类中传递了另一个测试.

这是通过测试:

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

这是失败的测试:

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

在第二次测试中,我得到了错误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)
Run Code Online (Sandbox Code Playgroud)

我收到了错误TypeError: argument of type 'NoneType' is not iterable.我在第二次测试中通过print语句确认了response.content包含我希望得到的页面,状态代码是否正确,以及模板是否正确.但是响应的背景始终None是第二次测试.

我通过标准的"python manage.py test ..."界面运行我的Django单元测试,所以我不相信我遇到了" 上下文是空的shell "问题.

这是怎么回事?

编辑:

如果我添加print type(resp.context['a_formset'])到每个测试,我得到的工作测试<class 'django.forms.formsets.AFormFormSet'>.对于非工作测试,我TypeError: 'NoneType' object has no attribute '__getitem__'再次获得.

Nab*_*bin 7

这是因为你遇到了一些错误,退出了shell并重新启动它.

但你忘了开始环境 ......

from django.test.utils import setup_test_environment
>>> setup_test_environment()
Run Code Online (Sandbox Code Playgroud)

那是我的问题.希望它有效......


小智 5

今天,我遇到了同样的问题。在第二次测试得到相同的页面无关,在response.context

我进行了一项研究,发现1)测试客户端使用信号填充上下文,2)第二个测试未调用我的view方法

我打开了一个调试器,发现有罪的是“缓存中间件”。知道我找到了这张票和这个SO问题(后者有一个解决方案)。

因此,简而言之:第二个请求是从缓存而不是视图中提供的,因此视图不会被执行,并且test-client无法获取信号,也无法填充上下文。

我无法为我的项目禁用缓存中间件,因此我在设置中添加了下一个hack-line:

if 'test' in sys.argv:
   CACHE_MIDDLEWARE_SECONDS = 0
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人