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__'再次获得.
这是因为你遇到了一些错误,退出了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)
希望这可以帮助某人