Всякий раз, когда я использую 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 в тест... в моей реальной жизни это не так. в тестах... это в коде, который я хочу протестировать.