每当我在测试中使用requestFactory时,例如:
顺便提一下,这个答案:访问Django测试中的request.user对象建议使用。
代替
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', 'foo@bar.com', '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
顺便提一下,这个答案:访问Django测试中的request.user对象建议使用。
response.context['user']
代替
request.user
但在我的代码中情况并非如此,据我所知,使用request.user是很正常的。为了解释我的问题,我将request.user放入了测试中...但在我的实际应用中,它并不在测试中...它在我想要测试的代码中。