Доступ к объекту request.user при тестировании Django - PullRequest
4 голосов
/ 26 февраля 2012

Я пытаюсь получить доступ к объекту request.user при тестировании моего приложения с использованием класса клиента django.

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'

Есть ли способ получить доступ к объекту пользователя из экземпляра клиента?Я хочу сделать это, чтобы проверить, правильно ли отображаются данные тестового пользователя.Я могу попытаться решить эту проблему, установив всю необходимую информацию во время настройки, но перед этим я хотел проверить, не пропускаю ли я что-то.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Использовать response.context['user'].

Пользователь автоматически доступен в контексте шаблона, если вы используете RequestContext.См. данные аутентификации в шаблонах документ.

В противном случае, я считаю, что вы просто должны запросить их:

 def test_one(self):
    response = self.client.get("/my_profile/")
    user = User.objects.get(username="foo")
    self.fail( user.some_field == False )
0 голосов
/ 01 марта 2018

Это может показаться окольным путем, но это может быть полезно.

Использование RequestFactory , это довольно просто.Он имитирует объект request .

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='foo@bar', 
                    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()

Надеюсь, это было полезно.

...