在测试中使用请求的用户信息

时间:2012-08-24 14:30:08

标签: django django-testing

我使用user.userprofile中的信息来管理权限。

我如何使用

# List of status
STATUS_CHOICES = (
    ('teacher', 'Teacher'),
    ('student', 'Student'),
)

# More field for an user.
class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='student')

现在,在一个视图中,我有例子:

# Only the owner view this template
if request.user.userprofile.status != 'teacher':
    return redirect('Penelope.views.home')

我是如何测试的:

def login_function(self, username, password, status):
    # Create a new user
    user = User.objects.create_user(username=username, password=password)
    user.userprofile.status = status
    user.save()

    # Use test client to perform login
    user = self.client.login(username=username, password=password)
    response = self.client.post('/login/')

class LoggedAsTeacherCase(TestCase):
    def setUp(self):
        # I create and log with a teacher user
        login_function(self, 'teststudent', 'password', 'teacher') 

    def test_login(self):  # Verify if login has been validated by server
        response = self.client.get('/login/')
        self.assertRedirects(response, '/')   # <<< It is ok (My user is detected as connected, he is redirected)

    def test_dashboard(self): 
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)   # <<< It is ok (Confirmation, my user is not redirected to login url, perfect)

    def test_newcourse(self):
        response = self.client.get('/newcourse/')
        self.assertEqual(response.status_code, 200)   # <<<  /!\ It is false, I have a redirection (302), not a 200...

所以,这意味着当视图测试用户是否是教师时(参见:我的主题的顶部),它发送了False ......

如何访问此信息并执行测试?

2 个答案:

答案 0 :(得分:2)

您对status字段的定义不正确。 CharFields需要一个&#34; max_length&#34;属性为正整数。

将其更改为以下内容:

models.CharField(max_length=..., choices=STATUS_CHOICES)

另见here

答案 1 :(得分:0)

我发现了问题!

user = User.objects.create_user(username=username, password=password)
user.userprofile.status = status
user.save()

当我这样做时,我认为user = User.objects.create_user(username=username, password=password)会返回一个用户(false)。

所以,我必须提出要求:

user = User.objects.create_user(username=username, password=password)
test = UserProfile.objects.filter(user=username)
test.status = status
test.save()

没关系!