django测试问题

django测试问题,django,unit-testing,Django,Unit Testing,这是我想接受测试的观点 def logIn(request): """ This method will log in user using username or email """ if request.method == 'POST': form = LogInForm(request.POST) if form.is_valid(): user = authenticate(username=for

这是我想接受测试的观点

def logIn(request):
    """
    This method will log in user using  username or email
    """
    if request.method == 'POST':
        form = LogInForm(request.POST)
        if form.is_valid():
            user = authenticate(username=form.cleaned_data['name'],password=form.cleaned_data['password'])
            if user:
                login(request,user)
                return redirect('uindex')
            else:
                error = "Nie prawidlowy login lub haslo.Upewnij sie ze wpisales prawidlowe dane"
    else:
        form = LogInForm(auto_id=False)
    return render_to_response('login.html',locals(),context_instance=RequestContext(request))
这是测试

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.client  = Client()
    def test_response_for_get(self):
        response =  self.client.get(reverse('logIn'))
        self.assertEqual(response.status_code, 200)
    def test_login_with_username(self):
        """
        Test if user can login wit username and password
        """
        user_name = 'test'
        user_email = 'test@test.com'
        user_password = 'zaq12wsx'
        u =  User.objects.create_user(user_name,user_email,user_password)
        response = self.client.post(reverse('logIn'),data={'name':user_name,'password':user_password},follow=True)
        self.assertEquals(response.request.user.username,user_name)
        u.delete()
当我运行此测试时,我在使用用户名登录测试时失败:

AttributeError: 'dict' object has no attribute 'user'
当我在视图中使用request.user.username时,没有错误,这只是在测试中失败。提前谢谢你的帮助 编辑:好,我将损坏的零件替换为

self.assertEquals(302, response.status_code)
但现在,这个测试中断了,另一个测试也中断了

AssertionError: 302 != 200
下面是我的代码,用于现在失败的视图。我希望电子邮件和用户名是唯一的

def register(request):
    """
    Function to register new user.
    This function will have to care for email uniqueness,and login
    """
    if request.method == 'POST':
        error=[]
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            if  form.cleaned_data['password'] ==  form.cleaned_data['password_confirmation']:
                password = form.cleaned_data['password']
                if len(User.objects.filter(username=username)) == 0 and len(User.objects.filter(email=email)) == 0:
                    #email and username are bouth unique
                    u = User()
                    u.username = username
                    u.set_password(password)
                    u.email = email
                    u.is_active = False
                    u.is_superuser = False
                    u.is_active = True
                    u.save()
                    return render_to_response('success_register.html',locals(),context_instance=RequestContext(request))
                else:
                    if len(User.objects.filter(username=username)) > 0:
                        error.append("Podany login jest juz zajety")
                    if len(User.objects.filter(email=email)) > 0:
                        error.append("Podany email jest juz zajety")
            else:
                error.append("Hasla nie pasuja do siebie")
        #return render_to_response('register.html',locals(),context_instance=RequestContext(request))
    else:
        form = RegisterForm(auto_id=False)
    return render_to_response('register.html',locals(),context_instance=RequestContext(request))
这是一个秘密进行的测试,但现在它被打破了

def test_user_register_with_unique_data_and_permission(self):
        """
        Will try to register user which provided for sure unique credentials
        And also make sure that profile will be automatically created for him, and also that he he have valid privileges
        """
        user_name = 'test'
        user_email = 'test@test.com'
        password = 'zaq12wsx'
        response = self.client.post(reverse('register'),{'username': user_name,'email':user_email,
        'password':password,'password_confirmation':password},follow=True)
        #check if code is 200
        self.assertEqual(response.status_code, 200)
        u = User.objects.get(username=user_name,email = user_email)
        self.assertTrue(u,"User after creation coudn't be fetched")
        self.assertFalse(u.is_staff,msg="User after registration belong to staff")
        self.assertFalse(u.is_superuser,msg="User after registration is superuser")
        p = UserProfile.objects.get(user__username__iexact = user_name)
        self.assertTrue(p,"After user creation coudn't fetch user profile")
        self.assertEqual(len(response.context['error']),0,msg = 'We shoudnt get error during valid registration')
        u.delete()
        p.delete()
以下是错误:

AssertionError: We shoudnt get error during valid registration
如果我禁用登录测试,一切正常。这个测试怎么能打破另一个呢?以及为什么登录测试没有通过。我在网站上试用过,效果很好。

对于测试客户端返回的响应对象,关于请求属性:

请求

刺激响应的请求数据

这对我来说意味着两件事之一。要么只是请求的数据,要么是处理请求之前的请求对象。在这两种情况下,您都不希望它包含已登录的用户

编写登录成功完成测试的另一种方法是将
follow=False
添加到
客户端。发布
呼叫并检查响应代码:

self.assertEquals(302, response.status_code)

这将检查是否已发生重定向

response.request
不是您所期望的视图中的
HttpRequest
对象。这是一个数据字典,激发了post请求。它没有用户属性,因此是
AttributeError

您可以将测试重写为:

  • 使用Django 1.3中引入的类,在测试中直接调用
    logIn
    ,而不是使用
    client.post
  • 发布后检查
    client.session
    ,检查用户是否已登录
  • 为什么一个失败的测试可以打破另一个 当你编辑问题时,你问

    这个测试怎么能打破另一个呢

    带有用户名的
    测试\u登录\u在到达
    u.delete
    之前失败,因此未删除在该测试中创建的用户。这导致
    test\u user\u register\u具有\u unique\u data\u和\u权限
    ,因为用户
    test
    已经存在


    如果使用该类,数据库将在每次测试之间重置,因此这不会是一个问题。

    您可以使用Client.login来测试用户logging@Ashok:Client.login对于测试需要身份验证的视图很有用,但在这种情况下,Artur想测试他的实际登录视图我可以解释为什么登录测试破坏了注册测试:在您修复登录测试之前,它在到达u.delete之前就失败了-所以当注册测试运行时,测试用户已经存在。最好的解决方案是在tearDown方法中删除测试用户,而不是在测试中删除。或者,在每个测试中使用不同的用户名和电子邮件,以便一个失败的测试不会影响其他测试。如果follow=False,则登录视图的响应状态代码将仅为302。当follow=True时,客户端将加载重定向url,因此状态代码将为200。那么200代码是我重定向到的页面的响应代码?在这种情况下,这200是用于uindex的?是的。根据阿拉斯代尔的建议进行我刚才建议的编辑,看看测试是否通过。