2012-02-17 11 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

テストクライアントはリクエストに依存しません。それは本質的にユーザがログインしているものに関する情報を保持していません。(あなたの実際のWebサーバやDjangoの開発サーバも、明白な理由のために、そして同じ理由がここに当てはまりません。

loginは、定義されたユーザーの資格情報を使用して/login/へのPOSTを本質的に模倣するためのテストクライアント上の単純な方法です。これ以上何もない。

実際のユーザーは、ビューのように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を行います:

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

このためmore detailed answerがあります。

+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以降、responseにはwsgi_requestという属性があり、表示されるのはrequestオブジェクトです。

だから、ログインしているユーザーを取得するのは非常に簡単です:

response.wsgi_request.user 
関連する問題