[英]Django TestCase object has no attribute 'login'
我使用 selenium 来测试我的登录方法,它工作正常。 然后,我尝试测试网站的其他部分。 所以,我需要在我的测试中创建一个用户。 为此,我使用了客户端而不是请求工厂(因为有中间件类)。 但是,我收到错误:
AttributeError: 'ProjectListTestCase' object has no attribute 'login'
我确实有一个自定义身份验证后端,以允许使用电子邮件地址而不是用户名:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'phonenumber_field',
'rest_framework',
# 3rd party apps
'crispy_forms',
# Local apps
'accounts',
...
我在控制台中尝试了代码:
>>> the_client = Client()
>>> the_client.login(email='test@testing.com', password='testingPassword')
True
这是我的 test_views.py 中的代码:
from django.core.urlresolvers import reverse
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.test import TestCase
from django.test import RequestFactory
from model_mommy import mommy
from selenium import webdriver
from project_profile.models import Project
from user_profile.models import UserProfile
class ProjectListTestCase(TestCase):
def setUp(self):
# login the user
self.login = self.client.login(email='test@testing.com', password='testingPassword')
print ('Login successful? ', self.login) # Just to see what's going on
self.response = self.client.get(reverse('development:list_view_developmentproject') )
print('response: ', self.response) # Just to see what's going on
def test_user_login(self):
self.assertEqual(self.response.status_code, 200)
为什么在运行测试时出现错误,但在控制台中使用相同的代码运行良好?
编辑 1:将 setUp 中的登录和响应更改为 self.login 和 self.response 以保持一致性。 我仍然收到一个错误:
TypeError: 'AnonymousUser' object is not iterable
编辑 2:完整回溯:
Traceback (most recent call last):
File "C:\Users\EarlyCoder\Environments\firone_3\firone\development\tests\test_views.py", line 25, in setUp
self.response = self.client.get(reverse('development:list_view_developmentproject'))
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\test\client.py", line 536, in get
**extra)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\test\client.py", line 340, in get
return self.generic('GET', path, secure=secure, **r)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\test\client.py", line 416, in generic
return self.request(**r)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\test\client.py", line 501, in request
six.reraise(*exc_info)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\utils\six.py", line 686, in reraise
raise value
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\views\generic\list.py", line 160, in get
self.object_list = self.get_queryset()
File "C:\Users\EarlyCoder\Environments\firone_3\firone\development\views\views_main.py", line 2057, in get_queryset
user_development_projects = Project.objects.filter(project__users = logged_in_user)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\query.py", line 784, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\query.py", line 802, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\sql\query.py", line 1250, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\sql\query.py", line 1276, in _add_q
allow_joins=allow_joins, split_subq=split_subq,
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\sql\query.py", line 1179, in build_filter
self.check_related_objects(field, value, opts)
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\db\models\sql\query.py", line 1078, in check_related_objects
for v in value:
File "C:\Users\EarlyCoder\Environments\firone_3\lib\site-packages\django\utils\functional.py", line 239, in inner
return func(self._wrapped, *args)
TypeError: 'AnonymousUser' object is not iterable
----------------------------------------------------------------------
Ran 1 test in 1.563s
FAILED (errors=1)
Destroying test database for alias 'default'...
编辑 3:添加DevelopmentProjectList
class DevelopmentProjectList(ListView):
model = DevelopmentProject
template_name = 'development/development.html'
context_object_name = 'development_projects'
def get_queryset(self, *args, **kwargs):
logged_in_user = self.request.user
user_development_projects = DevelopmentProject.objects.filter(project__users = logged_in_user)
return user_development_projects
正如@Iain Shelvington 在此评论中提到的,您尚未将变量login
分配给self
你应该做这样的事情,
class ProjectListTestCase(TestCase):
def setUp(self):
# login the user
self.login = self.client.login(email='test@testing.com', password='testingPassword')
print('Login successful? ', self.login) # Just to see what's going on
self.response = self.client.get(reverse('development:list_view_developmentproject'))
print('response: ', self.response) # Just to see what's going on
def test_user_login(self):
self.assertEqual(self.response.status_code, 200)
在您看来,您并没有强制用户登录。 因此,将LoginRequiredMixin
混合类添加到您的视图中,如下所示
from django.contrib.auth.mixins import LoginRequiredMixin
class DevelopmentProjectList(LoginRequiredMixin, ListView):
...
# your code
一致地使用login
/ response
或self.login
/ self.response
- 基于您是否想在test_user_login
使用它
您在此处分配变量login
:
login = self.client.login(email='test@testing.com', password='testingPassword')
然后尝试在此处访问self.login
:
print ('Login successful? ', self.login) # Just to see what's going on
同样适用于response
和self.response
最终代码可能如下所示:
from django.core.urlresolvers import reverse
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.test import TestCase
from django.test import RequestFactory
from model_mommy import mommy
from selenium import webdriver
from project_profile.models import Project
from user_profile.models import UserProfile
class ProjectListTestCase(TestCase):
def setUp(self):
# login the user
self.login = self.client.login(email='test@testing.com', password='testingPassword')
print ('Login successful? ', self.login) # Just to see what's going on
self.response = self.client.get(reverse('development:list_view_developmentproject') )
print('response: ', self.response) # Just to see what's going on
def test_user_login(self):
self.assertEqual(self.response.status_code, 200)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.