5

背景: ミドルウェアdjango-multihost(http://effbot.org/zone/django-multihost.htm) を使用して、単一の django アプリが同じプロジェクトの異なるホスト名に応答できるようにしています。ミドルウェアは、 HTTP 要求ヘッダー に基づいてROOT_URLCONF(つまり、どのファイルを) 変更します。urls.pyHost:

これはうまく機能しますが、ページが適切にロードされていることを確認する簡単な統合テストを書きたいと思います。/trendsページが読み込まれるかどうか、および「今日のトレンド」というテキストが表示されるかどうかを確認する基本的なテストの例を次に示します。

def test_homepage_loads(self):
    client = Client()
    client.login(username = 'testing', password = 'testing')
    page = client.get("/trends", follow = follow_redirects)
    self.assertEquals(page.status_code, 200)
    self.assertTrue( page.content.find('Trends for Today') > 0 )

問題は、ミドルウェアが呼び出すものではなく、常にデフォルトの ROOT_URLCONF を使用してロードすることです。のようにホスト名を URL に明示的に入れても問題ありませんclient.get("http://secondarysite/trends")

django テストクライアントを使用して他の仮想サイトでテストするにはどうすればよいですか? そのロジックをテストできるように、テストでミドルウェアを呼び出したいと思います。しかし、必要に応じて、テスト中に ROOT_URLCONF を設定するなどのハッキーなことをしたいと思いますが、その方法がわかりません。

4

2 に答える 2

11

Django クライアントを使用すると、次のように HTTP ヘッダーを設定できます。

client.get(url, HTTP_HOST = 'my.host.com')

基本的に、get関数は引数の dict を取り、それを HTTP ヘッダーとして使用します。setup()DRY に準拠するには、unittest クラスで次のようなことを行うことができます。

self.request_headers = { 'HTTP_HOST': 'foo' }

そして、あなたのテストメソッドで:

client.get(url, **self.request_headers)

注:これがあなたの問題に役立つかどうかはわかりません。ただし、これはヘッダーを設定するために私が考えることができる唯一の方法です。

私が考えることができる別の解決策は、次のように、テスト クラスに URLConf を設定することです。

class Mytest(TestCase):
    urls = 'my.urlconf'

ただし、これはミドルウェアをテストしません。

于 2010-11-09T19:24:19.273 に答える
2

http://docs.djangoproject.com/en/dev/topics/testing/#django.test.client.Client.get :

The extra keyword arguments parameter can be used to specify headers to be sent in the request

そのため、HTTP_HOST ヘッダーをオーバーライドしようとする場合があります。

于 2010-11-09T19:25:32.140 に答える