Django测试问题

标签 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=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 = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="750110060135011006015b161a18" rel="noreferrer noopener nofollow">[email protected]</a>'
        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()

当我运行这个测试时,我在 test_login_with_username 上失败了:

AttributeError: 'dict' object has no attribute 'user'

当我在 View request.user.username 中使用时,工作正常,没有错误,这只是在测试中失败。预先感谢您的任何帮助 编辑:好的,我用

替换损坏的部分
self.assertEquals(302, response.status_code)

但是现在这个测试失败了,另一个测试也失败了。

AssertionError: 302 != 200

这是我现在失败的 View 的代码。我希望电子邮件和用户名是唯一的。

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 = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="245041575064504157500a474b49" rel="noreferrer noopener nofollow">[email protected]</a>'
        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

如果我禁用登录测试,一切正常。这个测试如何破坏另一个测试?以及为什么登录测试没有通过。我在网站上尝试了一下,效果很好。

最佳答案

The documentation对于测试客户端返回的响应对象,说明了有关请求属性的信息:

request

The request data that stimulated the response.

这向我暗示了两件事之一。它要么只是请求的数据,要么是处理请求之前的请求对象。无论哪种情况,您都不会期望它包含登录的用户。

编写登录成功完成的测试的另一种方法是将 follow=False 添加到 client.post 调用并检查响应代码:

self.assertEquals(302, response.status_code)

这会检查重定向是否已发生。

关于Django测试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640652/

相关文章:

django - 为什么 django 中的 .filter() 返回重复的对象?

django - 使用 Django JWT token 进行 Ansible uri 调用

python-3.x - 如何在 Python 单元测试中模拟 readlines()

c++ - CUnit - 'Mocking' libc 函数

c# - 单元测试现有的 UI 代码

ios - 单元测试和 iOS : viewDidLoad triggered twice

python - 如何在 Django 中获取对象作为字符串?

django - 将 URL 中的页码改为 "embed"的最佳方法是什么?

python - 如何对具有多对多字段的 get_absolute_url 进行反向操作?

unit-testing - 在Grails中模拟mixin类