2012-04-10 77 views
3

我刚刚从Django 1.3.1移到了Django 1.4。这样做之后,我的测试一个真正的大数量开始提高这些错误:如何在测试时访问request.user?

Traceback (most recent call last): 
    File "/Volumes/Data/ADay/Website/Backend/(trunk)/project/tests/templatetags.py", line 406, in setUp 
    self.context = template.RequestContext(self.request) 
    File "/Library/Python/2.6/site-packages/django/template/context.py", line 176, in __init__ 
    self.update(processor(request)) 
    File "/Volumes/Data/ADay/Website/Backend/(trunk)/project/social_auth/context_processors.py", line 21, in social_auth_by_type_backends 
    data = backends_data(request.user) 
AttributeError: 'WSGIRequest' object has no attribute 'user' 

所有这些错误指的Django的社会背景下权威性处理器,试图让request.user建立请求上下文:

def social_auth_by_type_backends(request): 
    """Load Social Auth current user data to context. 
    Will add a output from backends_data to context under social_auth key where 
    each entry will be grouped by backend type (openid, oauth, oauth2). 
    """ 
    data = backends_data(request.user) 
    data['backends'] = group_backend_by_type(data['backends']) 
    data['not_associated'] = group_backend_by_type(data['not_associated']) 
    data['associated'] = group_backend_by_type(data['associated'], 
    key=lambda assoc: assoc.provider) 
    return {'social_auth': data} 

在构建请求上下文时,Django不会将请求传递给函数吗?我不认为就是这样,现在社交专家团队中的某个人可能会发现这样的问题。

编辑:

我首先认为这将是一些问题与过时的context_processor,但我检查,他们都应该是最新的:

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.messages.context_processors.messages', 
    "django.contrib.auth.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.static", 
    "django.contrib.messages.context_processors.messages", 
    'django.core.context_processors.request', 
    'pages.context_processors.media', 
    'social_auth.context_processors.social_auth_by_type_backends', 
    ) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

EDIT2:

好吧,随着网站的继续工作,这可能是我的测试代码的问题。这是它:

def setUp(self): 
    self.factory = RequestFactory() 
    # create an initial request including session data   
    self.response = self.client.get('/') 
    self.request = self.factory.get("/") #any valid url will do, i just need a request 
    self.request.session = self.client.session 

    self.context = template.RequestContext(self.request) 

最后一行然后引发错误。就像我的TestCase的setUp()函数一样,它开始在我的测试中引发异常。为什么这不再在Django 1.4中工作?

+0

使用你已经安装了身份验证的中间件?如果不是,则不会有request.user。 – 2012-04-10 19:19:13

+0

更新的问题 – marue 2012-04-10 19:49:21

回答

2

如果有人发现:使用RequestFactory创建的请求在使用RequestContext(请求)时不会返回request.user,即使安装了“django.contrib.auth.context_processors.auth”。但是,用户通过使用RequestContext的(要求)之前,自己要求正常工作:

class SampleTestCase(TestCase): 
    fixtures = ['user_fixture.json'] 

    def test_only_a_sample(self): 
     request.user = User.objects.get(pk=1) 
     self.context = RequestContext(request) 
     # some tests here 

这是最终为我工作的代码。

编辑:请求可以通过使用,

from django.test.client import RequestFactory 

# code suppressed 
def setUp(self): 
    self.factory = RequestFactory() 

def test_only_a_sample(self): 
    request = self.factory.get('/')  # or any other methods 
    request.user = User.objects.get(pk=1) 
# code follows 
+0

Thanx,一个很大的帮助! (可能是有用的缩短标题并添加它关于测试,虽然标签是关于测试) – 2013-06-15 11:57:24

+3

你在哪里定义“请求”? – Cerin 2015-04-23 21:18:08

相关问题