2012-02-25 6 views
4

djangoのクライアントクラスを使用してアプリケーションをテストするときにrequest.userオブジェクトにアクセスしようとしています。Djangoのテスト時にrequest.userオブジェクトにアクセス

from django.test import TestCase 
from django.test.client import Client 

class SomeTestCase(TestCase): 

    def setUp(self): 
     self.client = Client() 
     self.client.login(username="foo", password="bar") 

    def test_one(self): 
     response = self.client.get("/my_profile/") 
     self.fail(response.request.user) 

これは明らかに失敗しますが、response.requestにはユーザー属性がないため失敗します。

AttributeError: 'dict' object has no attribute 'user' 

クライアントインスタンスからユーザーオブジェクトにアクセスする方法はありますか。テストユーザーのデータが適切にレンダリングされているかどうかを確認するためにこれを実行したいと思います。私はsetUpの間に必要なすべての情報を設定することでこれに取り組もうとすることができますが、私がそれをする前に、何かが欠けていないかどうかを確認したいと思っていました。

答えて

2

response.context['user']を使用してください。

RequestContextを使用すると、テンプレートコンテキストでユーザーが自動的に利用可能になります。 doc:auth data in templatesを参照してください。

そうでなければ私はあなたがそれを照会すると信じて:

def test_one(self): 
    response = self.client.get("/my_profile/") 
    user = User.objects.get(username="foo") 
    self.fail(user.some_field == False) 
+2

http://stackoverflow.com/questions/2840467/problems-using-user-model-in-django-unit-testsこれはSecatorの推奨事項を使用していますが、setUpメソッドとtearDownメソッドではちょっとちょっとしたクリーナーです。 – Aea

0

これはそれを行うの回り道を見えるかもしれませんが、それは便利です。

RequestFactoryを使用してください。かなり簡単です。 要求オブジェクトを模倣します。

from django.test import TestCase, RequestFactory 
from django.test.client import Client 
from django.contrib.auth.models import User 

class SomeTestCase(TestCase): 

    def setUp(self): 
     self.client = Client() 
     self.factory = RequestFactory() 
     self.user = User.objects.create_user(
        username='foo', email='[email protected]', 
        password='bar') 

    def test_one(self): 
     self.client.login(username="foo", password="bar") 

     request = self.factory.get("/my_profile/") 
     request.user = self.user 

     #rest of your code 

    def tearDown(self): 
     self.user.delete() 

私はそれが役に立ちましたと思います。

関連する問題