15

我正在尝试使用其内置的登录功能登录测试客户端。我正在尝试对视图进行单元测试,并且需要登录以测试其中的一些。我一直在尝试这样做太久,需要帮助。几点注意事项:

create_user() 确实创建了一个有效用户,它已在其他位置使用。

根据我对 client.login() 的了解,它返回一个布尔值,当我运行测试时,失败是“False is not True”,所以这似乎是正确的。

我成功登录的唯一方法是调用 client.post("/my/login/url", {u​​sername and password in dict.}) 但是,由于某种原因,我的所有测试用例都没有保持登录状态我觉得很奇怪。

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.user = create_user()
    self.logged_in = self.client.login(username=self.user.username, password=self.user.password)

def test_valid(self):
    self.assertTrue(self.logged_in)

我已将其更改为以下内容:

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.password = "password"
    self.user = create_user(password=self.password)
    self.logged_in = self.client.login(username=self.user.username, password=self.password)

它仍然无法登录。

create user 在“Static”类中,user_count 初始化为 0,函数如下:

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%d@test.com" % Static.user_count

    Static.user_count += 1
    user = User.objects.create(username=username, password=password,   is_superuser=is_superuser)
4

1 回答 1

21

您无法直接访问密码。该password属性已加密。(请参阅Django 中的密码管理。)

例如,这里是密码的示例输出。

>>> user = User.objects.create_user(username='asdf', email='asdf@example.com', password='xxxx')
>>> user.password
'sha1$166e7$4028738f0c0df0e7ec3cec06843c35d2b5a1aae8'

如你所见,user.password是不是xxxx我给的。

我会修改create_user以接受可选的密码参数。并将密码传递给create_user, 和client.login如下:

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    password = 'secret'
    self.user = create_user(password=password)
    self.logged_in = self.client.login(username=self.user.username, password=password)

更新

create_user应该使用User.objects.create_user而不是User.objects.create. 并且应该返回创建的用户对象:

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%d@test.com" % Static.user_count

    Static.user_count += 1
    user = User.objects.create_user(username=username, password=password)
    #                   ^^^^^^^^^^^
    user.is_superuser = is_superuser
    user.save()
    return user # <---
于 2013-11-07T03:21:57.213 回答