Django TestCase对象没有属性';登录';

Django TestCase对象没有属性';登录';,django,django-testing,Django,Django Testing,我已经使用selenium测试了我的登录方法,它运行良好。然后,我试着测试网站的其他部分。所以,我需要在测试中创建一个用户。为此,我使用了客户机而不是请求工厂(因为有中间件类)。但是,我得到了一个错误: AttributeError: 'ProjectListTestCase' object has no attribute 'login' 我有一个自定义的身份验证后端,允许使用电子邮件地址而不是用户名: INSTALLED_APPS = [ 'django.contrib.admin', '

我已经使用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:将设置中的登录和响应更改为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
如前所述,您尚未将变量
分配给
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)

使用
login
/
response
self.login
/
self.response
,根据您是否想在
测试用户登录时使用

您在此处分配变量
login

login = self.client.login(email='test@testing.com', password='testingPassword')
print ('Login successful? ', self.login)          # Just to see what's going on
然后尝试访问
self.login
此处:

login = self.client.login(email='test@testing.com', password='testingPassword')
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)

print('Login successful?',self.Login)
您没有将Login分配给
self
它只是一个局部变量。您需要将其分配给
self
self.login=self.client.login(…)
),或者不将其作为
self'
print('login successful?'.login)
)上的属性引用同样适用于
self.response
虽然应该将login更改为self.login,但它对实际登录过程没有影响。login
self.client.login
应该返回True或False,而不管您将其放置在哪里,login或self.login。从那时起,self.client应该经过身份验证,以返回状态为200的响应。我确实按照您的建议更改了我的代码,但我仍然收到一个错误:
TypeError:“AnonymousUser”对象不可编辑
虽然登录应更改为self.login,但它对实际登录过程没有影响。login
self.client.login
应返回True或False,无论您将其放置在何处,login或self.login.From然后,self.client应该经过身份验证,以返回一个状态代码为200的响应。我确实按照您的建议更改了代码,但仍然得到一个错误:
TypeError:“AnonymousUser”对象不可编辑
它对登录过程没有影响,但对您在原始帖子中提到的错误有影响。@Early编码器,无论哪种方式,您都应该添加完整的错误回溯您注意到一个错误是正确的,
AttributeError:'ProjectListTestCase'对象没有属性'login'
但是,主要错误是由于登录:
TypeError:'AnonymousUser'对象不可编辑
我将更新您的答案,因为它成功地调试了一个错误,但我仍将等待解决主要错误的答案。因此,我没有包含修饰的分派方法。因此,使用mixin的替代方法是使用
@method\u decorator(需要登录)
在分派时。由于我的同一代码在其他项目中工作,因此很难调试,并且我无法找出导致错误的原因。非常感谢您花时间找出根本原因。