10

単体テストから呼び出す関数があります。いくつかのデバッグトレースを設定することから、関数が魅力的に機能し、すべての値が返されるように正しく準備されていることがわかりました。

これは私のテストコードがどのように見えるかです (私の ipdb.set_trace() がどこにあるかを見てください):

@override_settings(REGISTRATION_OPEN=True)
def test_confirm_account(self):
    """ view that let's a user confirm account creation and username
        when loggin in with social_auth """    
    request = self.factory.get('')
    request.user = AnonymousUser()
    request.session={}
    request.session.update({self.pipename:{'backend':'facebook',
                                           'kwargs':{'username':'Chuck Norris','response':{'id':1}}}})

    # this is the function of which i need the context:
    response = confirm_account(request)
    self.assertEqual(response.context['keytotest'],'valuetotest')

Django docs のこの部分から私が知っていることから、テストクライアントを使用すると、response.context にアクセスできるようになります。しかし、私がやったように response.context にアクセスしようとすると、次のようになります:

AttributeError: 'HttpResponse' オブジェクトに属性 'context' がありません

クライアントを使用せずに、クライアントの特別な HttpResponse オブジェクトを取得する方法はありますか?

4

5 に答える 5

11

RequestFactory は Django ミドルウェアに触れないため、コンテキストを生成しません (つまり、ContextManager ミドルウェアはありません)。

コンテキストをテストする場合は、テスト クライアントを使用する必要があります。次のように、モックを使用するか、テストで事前にセッションを保存するだけで、テスト クライアントでリクエストの構築を操作できます。

from django.test import Client
c = Client()
session = c.session
session['backend'] = 'facebook'
session['kwargs'] = {'username':'Chuck Norris','response':{'id':1}}
session.save()

これで、テスト クライアントでビューをロードすると、設定したとおりにセッションが使用され、 を使用するとresponse = c.get('/yourURL/')、必要に応じて応答コンテキストを参照できresponse.contextます。

于 2012-07-19T02:16:47.463 に答える
1

これは古い投稿ですが、このヒントが役立つと思います。またはの代わりに使用できるTemplateResponse(または)を使用して調べることができます。SimpleTemplateResponserenderrender_to_response

Django docsにはこれに関する詳細があります

于 2015-11-19T11:23:44.040 に答える
0

はい、できます。レンダリングにパッチを適用する必要があります。

私はpytest-djangoを使用しています

class Test:
    def context(self, call_args):
        args, kwargs = call_args
        request_mock, template, context = args
        return context

    @patch('myapplication.views.render')
    def test_(self, mock_render, rf):
        request = rf.get('fake-url')
        view(request)
        context = self.context(mock_render.call_args)

        keytotest = 'crch'
        assert keytotest == context['keytotest']
于 2016-06-07T19:02:57.420 に答える
-5

context (sic!) は Response クラスにあります。ご覧のとおり、ビュー関数から返されるHTTP応答です。これは、直接呼び出したために発生しました。テスト クライアント経由でこの関数を呼び出すと問題ありません。

response = client.get('/fobarbaz/')
response.context
于 2012-04-13T22:33:24.667 に答える