4

Django1.3.1からDjango1.4に移行しました。そうしてすぐに、私のテストの非常に多くがこれらのエラーを引き起こし始めました:

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'

これらのエラーはすべて、request.userにリクエストコンテキストを構築しようとするdjango-social-authコンテキストプロセッサを参照しています。

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は、リクエストコンテキストの構築中に、リクエストを関数に渡しませんか?それだけではないと思います。social-authチームの誰かが、おそらく今までにそのような問題を発見したでしょう。

編集:

私は最初、非推奨の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()関数にあるので、テスト全体でその例外が発生し始めます。なぜこれがDjango1.4で機能しなくなったのですか?

4

2 に答える 2

2

誰かがこれを見つけた場合:「django.contrib.auth.context_processors.auth」がインストールされている場合でも、RequestFactoryで作成されたリクエストはRequestContext(request)を使用するとrequest.userを返さないように見えます。ただし、RequestContext(request)を使用する前に、ユーザーを自分でリクエストに渡すことは問題なく機能します。

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
于 2012-04-11T19:50:54.933 に答える
0

特権ビューをテストするには、認証されたユーザーが必要でした。応答でコンテキストを取り戻す必要がありました。RequestFactoryは機能しますが、コンテキストを含まないHttpReponseを取得します。

これは私がしたことであり、それはうまくいきました。

class MyTestCase(TestCase):
    def setUp(self):
        self.client.login(username='user@myorg.com', password='Secret')

    def test_create_event(self):
        print("Testing create...")
        response = self.client.post('/event/new_event/', form_data_dict)
        self.assertEqual(response.status_code, 200)
        event_id = response.context['event'].event_id
于 2019-04-10T20:24:20.687 に答える