2012-04-13 16 views
7

私はunittestから呼び出す関数を持っています。いくつかのデバッグトレースを設定することから、私は関数がチャームのように機能し、戻り値のために正しく準備されたすべての値を持っていることを知っています。テストクライアントなしでテストしたビューの応答コンテキストにアクセスできますか?

これは、(ここで、私のipdb.set_trace(参照)である)私のtestcodeは、次のようになります。

@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') 

私はthis part of the Django docsから知っているから、私が使用しているとき、私はresponse.contextにアクセスすることができるだろうテストクライアント。私はそれをしなかったようresponse.contextにアクセスしようとする。しかし、私はこれを取得:

AttributeError: 'HttpResponse' object has no attribute 'context'

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

答えて

-3

応答クラスでは、コンテキスト(sic!)を見つけることができます。ご覧のとおり、それはです。HTTP応答はビュー機能から戻ってきます。これは、あなたが直接電話したために起こりました。テストクライアント経由でこの関数を呼び出しても問題ありません。

response = client.get('/fobarbaz/') 
response.context 
+0

テストクライアント経由で呼び出しても、要求の構成を完全に制御することはできません。私は明白に、それがクライアントなしで可能かどうか尋ねました。 – marue

+0

私はテストで組み込みのクライアントを使ってセッションを操作しています(client.sessionを見てください)。これは、あなたが要求した制御権と呼んでいますか?もしそうなら、あなたの下垂体を再考してください。 – starenka

+2

いいえ、そうではありません。セッションは、サーバー側に格納されている特定のユーザーに関する情報です。要求は、サーバーの応答を要求するためにクライアントがサーバーに送信するものです。応答コンテキスト(私が求めていた)は、テストにのみ使用され、サーバーが応答を作成した方法(つまり、どのテンプレートが使用されているか)に関する情報が含まれています。要求コンテキストと同じではなく、セッションと同じでもありません。 – marue

8

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を使用して応答コンテキストを参照できます。

1

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

Django docsはい、できます。この

0

の詳細を持っています。レンダリングをパッチする必要があります。

私はpytest-ジャンゴ

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'] 
0

「response.context」を使用して間違っていますが、あなたはTemplateResponseに渡された同じコンテキストを取得するためにresponse.context_dataを使用することができますよ。

+0

あなたはダウン投票されましたが、これは正しいです。'response.context'は' ContextList'オブジェクトですが、 'response.context_data'はテンプレートに渡される' Context'インスタンスのように構造化された辞書です。 –

関連する問題