python - 使用 factory_boy 和 Authtools 的 Django-Python Django 登录测试失败

标签 python django unit-testing factory-boy

当我想测试登录功能时,我的单元测试失败了。当我在我的浏览器中测试时是可以的。

我正在使用:

django==1.6.5
factory-boy==2.4.1
WebTest==2.0.15
django-webtest==1.7.7
nose==1.3.3
django-nose==1.2

没有自定义用户模型。用户模型是 authtools.models.User。

我的观点:

from authtools.views import LoginView
from django.views.generic import TemplateView
from django.core.urlresolvers import reverse

class Home_view(LoginView):
    template_name = 'users/home.html'
    disallow_authenticated = False

    def get_success_url(self):
        return reverse('users:blob')


class Blob_view (TemplateView):
    template_name = "users/blob.html"

我的工厂:

import factory


from django.conf import settings
from django.contrib.auth.hashers import make_password

class UserFactory (factory.DjangoModelFactory):
    """
    Factory used to instanciate a :class: Users.User
    """

    class Meta:
        model = settings.AUTH_USER_MODEL

    name = factory.Sequence(lambda n: 'user%d' % n)
    email = factory.LazyAttribute(lambda obj: '%s@eCRD.com' % obj.name)
    password = make_password('eCRD')
    is_active = True

我的测试:有两个测试。第一个测试客户端登录,第二个测试 View :

from django.core.urlresolvers import reverse


from django_webtest import WebTest
from authtools.models import User
from rest_framework import status


from .factories import UserFactory


class UserLoginTests(WebTest):

    def setUp(self):
        self.user = UserFactory()


    def tearDown(self):
        User.objects.get(email = self.user.email).delete()

    def test_user_login_client(self):
        self.resp = self.client.login(username = self.user.email, password = self.user.password
        )
        self.assertEqual(self.resp, True)
        self.client.logout()

    def test_user_logsin_view(self):
        Home_View = self.app.get(reverse('users_home'))
        Login_Form = Home_View.forms['login-form']
        Login_Form['username'] = self.user.email
        Login_Form['password'] = self.user.password
        response = Login_Form.submit().follow()
        self.assertEqual(redirect.status_code, status_HTTP_200_ok)
        self.client.logout() 

两个测试都失败了。但在浏览器中它运行良好。

谢谢。

最佳答案

我自己回答。解决方法是:钩子(Hook)下的Factory_boy调用model.objects.create()。当您创建用户时,身份验证模型会调用 model.objects.create_user()。两者都有效。但不同的是,create_user 使用 django.contrib.auth.hashers.make_password 进行密码加密,而 create 将密码保存为纯文本。那么解决方法是:

from django.core.urlresolvers import reverse


from django_webtest import WebTest
from authtools.models import User
from rest_framework import status


from .factories import UserFactory, user_password


class UserLoginTests(WebTest):

    def setUp(self):
        self.user = UserFactory()


    def tearDown(self):
        User.objects.get(email = self.user.email).delete()

    def test_user_login_client(self):
        self.resp = self.client.login(username = self.user.email, password = user_password
        )
        self.assertEqual(self.resp, True)
        self.client.logout()

    def test_user_logsin_view(self):
        Home_View = self.app.get(reverse('users_home'))
        Login_Form = Home_View.forms['login-form']
        Login_Form['username'] = self.user.email
        Login_Form['password'] = user_password
        response = Login_Form.submit().follow()
        self.assertEqual(redirect.status_code, status_HTTP_200_ok)
        self.client.logout() 

还有工厂

import factory


from django.conf import settings
from django.contrib.auth.hashers import make_password

user_password = 'test'   # Testing password 

class UserFactory (factory.DjangoModelFactory):
    """
    Factory used to instanciate a :class: Users.User
    """

    class Meta:
        model = settings.AUTH_USER_MODEL

    name = factory.Sequence(lambda n: 'user%d' % n)
    email = factory.LazyAttribute(lambda obj: '%s@eCRD.com' % obj.name)
    password = make_password(user_password)
    is_active = True

关于python - 使用 factory_boy 和 Authtools 的 Django-Python Django 登录测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748222/

相关文章:

python - PyQt QDialog 返回响应是或否

python - 在 Python 中编译搜索模式

python - python 3.2.3 中的 Zip 函数无法正常工作

python - 网站开发的设置过程是怎样的?

python - 如何在 Django 中检查与 mysql 的数据库连接

python - django 不读我的 models.py

django - 根据其他字段限制外部字段的选择

c# - 最小起订量:设置一个模拟方法以在第一次调用时失败,在第二次调用时成功

python - 当 Pyunit 和 Nose 测试失败时,为什么 py.test 通过单元测试(如预期的那样)?

unit-testing - 如何保证 FsCheck 的重现性