2012-08-03 19 views
9

POSTリクエストを使用して送信されたトランザクションステータス情報を処理する必要がある(特に)Django Webアプリケーションを開発中です。面白いビジネスを予防しようとするsettings.pyのエントリに対する支払いゲートウェイでサポートされているHTTPのセキュリティに加えてDjangoテストでHTTP_REFERERヘッダを設定する

、私の見解をチェックrequest.META['HTTP_REFERER']

if request.META.get('HTTP_REFERER', '') != settings.PAYMENT_URL and not settings.DEBUG: 
    return HttpResponseForbidden('Incorrect source URL for updating payment status') 

今、私がテストする方法をうまくしたいのですがこの動作。

私は失敗を簡単に生成することができます。 HTTP_REFERERは(予想通り)通常のページのロードとNone次のとおりです。

def test_transaction_status_succeeds(self): 
    response = self.client.post(reverse('transaction_status'), { ... }) 
    self.assertEqual(response.status_code, 403) 

どのように、しかし、私は偽の成功提出できますか?私はをextraに設定しようとしました。self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'})ですが、これは機能しません。ビューには明らかにまだ空白のヘッダーが表示されています。

テストクライアントはカスタムヘッダーをサポートしていますか?そうでなければ回避策はありますか?私はDjango 1.1を使用していますが、できるだけ早くアップグレードすることを好まないでしょう。

+0

これはあなたの問題ではありませんでしたが、私が持っていた難しさを持っている他の人のために://ドキュメント:Djangoは、私は適切に文書[ここ](HTTPSとして自分の名前を変換していなかったので、私は、送信されたヘッダを認識していませんでした。 djangoproject.com/en/1.6/topics/testing/tools/#django.test.client.Client.get)、[CGI仕様書を記載しました](http://tools.ietf.org/html/draft-robinson- www-interface-00#page-8)。たとえば、 'X-CSRFToken'は' HTTP_X_CSRFTOKEN'です。それらを変換した後、私は単に以下のsupervacuoの答えのように、それらをkwargsとして使うことができます。 –

答えて

14

ほぼ正しい。それは実際にあります:

def transaction_status_suceeds(self): 
    response = self.client.post(reverse('transaction_status'), {}, HTTP_REFERER='http://foo/bar') 

ときreading the source of test/client.py私は**(散布演算子/キーワード引数開梱作業/ whatever)を逃したと思います。 extraは、関数自体に対する余分なキーワード引数の辞書になります。

+0

これを使用しようとすると、 "__init __()に予期しないキーワード引数 'HTTP_REFERER'があります。おそらくそれはdjangoの新しいバージョンで変更されましたか? 'の代わりに(私はそれを考えることができる唯一のことは、__init__''呼びます):あなたは、C =クライアント(HTTP_REFERER = '// fooの/バーのhttp') '行われている場合がありますように –

+0

@StevenRogersは、それが聞こえます。私はポスト 'へkwargとして()'& '')(得ることを加えることを示唆しました。私はDjango 1.7.3でこれをテストしましたが、うまくいくようです... – supervacuo

0

あなたはClientのコンストラクタにHTTPヘッダを渡すことができます。

from django.test import Client 
from django.urls import reverse 

client = Client(
    HTTP_USER_AGENT='Mozilla/5.0', 
    HTTP_REFERER='http://www.google.com', 
) 
response1 = client.get(reverse('foo')) 
response2 = client.get(reverse('bar')) 

あなたは、ヘッダーにあなたが要求を行うたびに渡す必要はありませんこの方法です。

関連する問題