Mac*_*yka 5 python django django-generic-views django-class-based-views
我正在尝试编写一个测试来验证从基于类的通用视图返回的HTML.假设我有这个基于函数的视图,只需渲染一个模板:
# views.py
from django.shortcuts import render
def simple_view(request, template='template.html'):
return render(request, template)
Run Code Online (Sandbox Code Playgroud)
有了它,在测试期间我可以这样做:
# tests.py
from django.http import HttpRequest
from .views import simple_view
request = HttpRequest()
response = simple_view(request)
Run Code Online (Sandbox Code Playgroud)
然后对其进行验证response.现在我想将上面的内容转换为继承自TemplateView的基于类的视图:
# views.py
from django.views.generic import TemplateView
class SimpleView(TemplateView):
template_name = 'template.html'
Run Code Online (Sandbox Code Playgroud)
现在基本相同的测试方法失败了:
# tests.py
from django.http import HttpRequest
from .views import SimpleView
request = HttpRequest()
view_func = SimpleView.as_view()
response = view_func(request).render()
Run Code Online (Sandbox Code Playgroud)
结果是
Traceback (most recent call last):
File "tests.py", line 30, in test_home_page_returns_correct_html
response = view_func(request).render()
File "lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "lib/python2.7/site-packages/django/views/generic/base.py", line 82, in dispatch
if request.method.lower() in self.http_method_names:
AttributeError: 'NoneType' object has no attribute 'lower'
Run Code Online (Sandbox Code Playgroud)
我已尝试request.method手动设置GET,但这只会引发另一个错误抱怨session不在request.
有没有办法从TemplateView获得"空"请求的响应?
感谢dm03513的指针!确实我必须使用RequestFactory,但也要确保request包含空session(尽管SessionMiddleware首先列出):
# tests.py
from django.test import TestCase
from django.test.client import RequestFactory
class SimpleTest(TestCase):
def setUp(self):
self.factory = RequestFactory()
def test_home_page_returns_correct_html(self):
request = self.factory.get('/')
request.session = {}
view_func = SimpleView.as_view()
response = view_func(request)
response.render()
self.assertIn('<html>', response.content)
Run Code Online (Sandbox Code Playgroud)