Django 测试用例错误 'WSGIRequest' 对象没有属性 'session'
Django Test Case Error 'WSGIRequest' object has no attribute 'session'
我正在尝试为我的 Django 应用程序编写一些测试,但它抛出了一个错误:
File "/Users/croberts/.virtualenvs/litem/lib/python3.4/site-packages/django/contrib/auth/__init__.py", line 101, in login
if SESSION_KEY in request.session:
AttributeError: 'WSGIRequest' object has no attribute 'session'
这是我正在尝试的代码 运行:
class SimpleTest(TestCase):
def setUp(self):
self.request_factory = RequestFactory()
def test_signup(self):
request = self.request_factory.post("/signup/", {
"email": "email@email.com",
"password": "password",
"password-confirm": "password",
"firm": "big law firm"})
response = signup_user(request)
user = User.objects.get(email="email@email.com")
self.assertEqual(user.username, "email@email.com")
self.assertEqual(user.firm, "big law firm")
self.assertEqual(response.status_code, 302) #if it's successful it redirects.
这是我的中间件:
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
和我安装的应用程序:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'patents',
]
尝试使用测试客户端而不是请求工厂。这也有测试您的 URL 配置的优势。
class SimpleTest(TestCase):
def test_signup(self):
response = self.client.post("/signup/", {
"email": "email@email.com",
"password": "password",
"password-confirm": "password",
"firm": "big law firm"})
user = User.objects.get(email="email@email.com")
self.assertEqual(user.username, "email@email.com")
self.assertEqual(user.firm, "big law firm")
self.assertEqual(response.status_code, 302) #if it's successful it redirects.
对于使用 Django 2.0 及更高版本的任何人 - RequestFactory() 无法访问中间件:
It does not support middleware. Session and authentication attributes must be supplied by the test itself if required for the view to function properly.
https://docs.djangoproject.com/en/2.2/topics/testing/advanced/#the-request-factory
因此需要手动添加如下:
from django.contrib.sessions.middleware import SessionMiddleware
class SimpleTest(TestCase):
def setUp(self):
self.request_factory = RequestFactory()
middleware = SessionMiddleware()
middleware.process_request(self.request_factory)
self.request_factory.session.save()
def test_signup(self):
...
在 django 3.1 中,在遵循@Alasdair 的回答后,我得到了这个错误'AttributeError: 'RequestFactory' object has no attribute 'COOKIES'。我通过首先初始化请求解决了这个问题,下面是代码片段。
def setUp(self):
request = RequestFactory().get('/')
middleware = SessionMiddleware()
middleware.process_request(request)
request.session.save()
编辑 4.0 版 sessionmiddlewre 需要一个位置参数:'get_response' 所以:
def setUp(self):
request = RequestFactory().get('/')
middleware = SessionMiddleware(request)
middleware.process_request(request)
request.session.save()
我正在尝试为我的 Django 应用程序编写一些测试,但它抛出了一个错误:
File "/Users/croberts/.virtualenvs/litem/lib/python3.4/site-packages/django/contrib/auth/__init__.py", line 101, in login
if SESSION_KEY in request.session:
AttributeError: 'WSGIRequest' object has no attribute 'session'
这是我正在尝试的代码 运行:
class SimpleTest(TestCase):
def setUp(self):
self.request_factory = RequestFactory()
def test_signup(self):
request = self.request_factory.post("/signup/", {
"email": "email@email.com",
"password": "password",
"password-confirm": "password",
"firm": "big law firm"})
response = signup_user(request)
user = User.objects.get(email="email@email.com")
self.assertEqual(user.username, "email@email.com")
self.assertEqual(user.firm, "big law firm")
self.assertEqual(response.status_code, 302) #if it's successful it redirects.
这是我的中间件:
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
和我安装的应用程序:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'patents',
]
尝试使用测试客户端而不是请求工厂。这也有测试您的 URL 配置的优势。
class SimpleTest(TestCase):
def test_signup(self):
response = self.client.post("/signup/", {
"email": "email@email.com",
"password": "password",
"password-confirm": "password",
"firm": "big law firm"})
user = User.objects.get(email="email@email.com")
self.assertEqual(user.username, "email@email.com")
self.assertEqual(user.firm, "big law firm")
self.assertEqual(response.status_code, 302) #if it's successful it redirects.
对于使用 Django 2.0 及更高版本的任何人 - RequestFactory() 无法访问中间件:
It does not support middleware. Session and authentication attributes must be supplied by the test itself if required for the view to function properly.
https://docs.djangoproject.com/en/2.2/topics/testing/advanced/#the-request-factory
因此需要手动添加如下:
from django.contrib.sessions.middleware import SessionMiddleware
class SimpleTest(TestCase):
def setUp(self):
self.request_factory = RequestFactory()
middleware = SessionMiddleware()
middleware.process_request(self.request_factory)
self.request_factory.session.save()
def test_signup(self):
...
在 django 3.1 中,在遵循@Alasdair 的回答后,我得到了这个错误'AttributeError: 'RequestFactory' object has no attribute 'COOKIES'。我通过首先初始化请求解决了这个问题,下面是代码片段。
def setUp(self):
request = RequestFactory().get('/')
middleware = SessionMiddleware()
middleware.process_request(request)
request.session.save()
编辑 4.0 版 sessionmiddlewre 需要一个位置参数:'get_response' 所以:
def setUp(self):
request = RequestFactory().get('/')
middleware = SessionMiddleware(request)
middleware.process_request(request)
request.session.save()