2012-02-17 4 views
18

서면 django 테스트에서 현재 로그인 한 사용자를 얻으려면 어떻게해야합니까?django - 테스트 클라이언트에 사용자 로그인

def test_author_set_once(self): 
    self.client.login(username='Adam', password='password') 
    #create an object and test the author is adam 
    self.client.login(username='Barry', password='password') 
    #modify the first object and test that the author has not changed 

그래서 내가 좋아하는 뭔가를 말할 수 있어야합니다 ...

self.assertEqual(object.author, self.client.user) 

(하지만 난 할 수 없습니다) : 예를 들어

이 내가 쓰고 싶은 테스트입니다 나는 순간에 그것을 코딩 한

방법은 다음과 같이이다 :

self.client.login(username='Adam', password='password') 
self.user = User.objects.get(username='Adam') 
#create an object 
self.assertEqual(object.author, self.user) 

이것은 request.user가 특정 사용자 개체와 동일하다는 가정하에 있습니다. 나는 그것이 OK다고 생각한다. 그러나 그것은 조금 clunky 히 보인다.

어쨌든 가정을 피할 수 있습니까?

답변

24

테스트 클라이언트는 요청에 독립적입니다. 본질적으로 사용자가 로그인 한 내용에 대한 정보를 보유하지는 않습니다 (실제 웹 서버 또는 Django 개발 서버도 분명한 이유와 동일한 이유로 여기에 적용됩니다).

login은 정의 된 사용자 자격 증명을 사용하여 POST를 본질적으로 /login/으로 모방하는 테스트 클라이언트의 편리한 방법입니다. 아무것도 더.

실제 사용자는보기와 마찬가지로 request에서 볼 수 있습니다. 그러나 뷰에 직접 액세스 할 수 없기 때문에 Django는 뷰의 응답에서 request을 사용할 수있게합니다. 장고의

response.request.user 

최신 버전이 사용됩니다 : 당신이 실제로보기를로드 테스트 클라이언트를 사용 후에는 결과를 저장하고 다음을 통해 사용자가 얻을 수있는 사실

response.context["user"] 
+3

내 응답은 요청 사전에 사용자이 없습니다. – powlo

+0

여기에 있습니다. 존재하지 않는다. –

+17

좋습니다. 이 답변을 ** 2 년 전 **에 추가했습니다. 당연히 Django는 그 이후로 조금 변경되었습니다 (3, count 'em, 3 가지 주요 개정판). 그것은 내 대답을 하향식으로 시작할 이유가 아닙니다. http://stackoverflow.com/privileges/vote-down –

27

을 수행 할 수 있습니다 ' 테스트 클라이언트 응답을 통해 현재 사용자에게 액세스합니다. 일부 사용자가 로그인되어있는 경우

그러나, 당신은 확인할 수의 검사 self.client.session 할 것입니다. 이것에 대한 more detailed answer 있습니다

self.client.session['_auth_user_id'] 
>>> 1 

.

+0

감사합니다. 위의 포스터는 "보기를 호출하고 테스트 케이스에서 응답을 얻은 후에"답변을 기쁜 듯이 썼습니다. – Phlip

+0

[답변에 대한 응답] (http://stackoverflow.com/a/35871564/307511)은 실제로 현재 사용자를 확보 할 수 있음을 증명합니다. – emyller

+0

@emyller는 내 대답을 자유롭게 편집 할 수 있습니다. ¯ \ _ (ツ) _/¯ – hso

0

당신은 log in with a test user과 같이 할 수 있습니다 : 이제

from django.contrib.auth.models import User 
user = User.objects.create_user('foo', '[email protected]', 'bar') 
self.client.login(username='foo', password='bar') 

, 당신은 당신의 검사 결과에 user를 사용할 수 있습니다

self.assertEqual(created_model_object.user, user)

4

을 내가 사용중인 버전을 알지 못한다. 1.10.2부터 responsewsgi_request 속성이 있고보기에 request 개체로 사용됩니다.

그래서 그것은 사용자가 로그인하기가 매우 간단합니다

response.wsgi_request.user 
관련 문제