Django test RequestFactory не включает request.user

Всякий раз, когда я использую requestFactory во время тестирования, например:

from django.contrib.auth.models import User
from django.test import TestCase
from django.test.client import RequestFactory
from django.test.client import Client
import nose.tools as nt

class TestSomeTestCaseWithUser(TestCase):

    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()
        self.client = Client()
        self.user_foo = User.objects.create_user('foo', '[email protected]', 'bar')

    def tearDown(self):
        # Delete those objects that are saved in setup
        self.user_foo.delete()

    def test_request_user(self):
        self.client.login( username='foo', password='bar')
        request = self.factory.post('/my/url/', {"somedata": "data"})
        nt.assert_equal(request.user,self.user_foo)

на все, что я пытаюсь сделать с request.user:

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

это не сработает, поэтому я добавил обходной путь:

def test_request_user(self):
    # Create an instance of a GET request.
    self.client.login( username='foo', password='bar')
    request = self.factory.post('/my/url/', {"somedata": "data"})
    # a little workaround, because factory does not add the logged in user
    request.user = self.user_foo
    nt.assert_equal(request.user,self.user_foo)

Я часто использую request.user в своем коде... так же и в вещах, которые я хочу (модуль) протестировать...

Благодаря этому вопросу и ответу я узнал, что вам нужно добавить пользователя в запрос вручную: Как получить доступ к request.user во время тестирования? и я добавил это как обходной путь.

Мои вопросы:

  • Почему это?
  • Похоже на ошибку в фабрике запросов, не так ли? (так это обходной путь или просто недокументированная функция)
  • Или я делаю что-то еще не так? (сочетание тестового клиента и фабрики)
  • Есть ли лучший способ протестировать зарегистрированных пользователей в запросе?

Я тоже пробовал это: та же проблема

    response = self.client.post("/my/url/")
    request = response.request

Кстати, этот ответ: Доступ к объекту request.user при тестировании Django предлагает использовать

response.context['user'] 

вместо

request.user

Но в моем коде это не так, и, насколько я знаю, request.user перестал нормально использоваться, и чтобы объяснить мою проблему, я поместил request.user в тест... в моей реальной жизни это не так. в тестах... это в коде, который я хочу протестировать.


person michel.iamit    schedule 15.06.2013    source источник


Ответы (1)


извините... кажется, это задокументированная функция...

однако было бы неплохо привести лучший пример.

см. это.

вот он в третьем элементе списка:

Он не поддерживает промежуточное ПО. Атрибуты сеанса и аутентификации должны быть предоставлены самим тестом, если это требуется для правильной работы представления.

однако... это кажется противоречащим первым предложениям:

RequestFactory использует тот же API, что и тестовый клиент. Однако вместо того, чтобы вести себя как браузер, RequestFactory предоставляет способ создания экземпляра запроса, который можно использовать в качестве первого аргумента для любого представления. Это означает, что вы можете протестировать функцию просмотра так же, как и любую другую функцию.

особенно так же

Не уверен, что мне следует удалить этот вопрос... решение этой проблемы заняло у меня много времени... чем понимание моего обходного пути...

Так что я полагаю, что кто-то может использовать это, а также ..

и я только что добавил запрос на расширение документации: https://code.djangoproject.com/ticket/20609

person michel.iamit    schedule 15.06.2013
comment
Добавление обновленной ссылки, так как эта другая для версии 1.5 больше не работает. docs.djangoproject.com/en/1.8 /topics/testing/advanced/. - person cjukjones; 09.03.2016