11

Django 国際化ツールを使用して、アプリケーションからいくつかの文字列を翻訳しています。コードは次のようになります。

from django.utils.translation import ugettext as _
def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)

次に、 Django テスト クライアントを使用して単体テストを作成しています。これらのテストは、ビューにリクエストを送信し、返されたコンテンツを比較します。

単体テストの実行中に翻訳を無効にするにはどうすればよいですか? 私はこれを行うことを目指しています:

class FoobarTestCase(unittest.TestCase):
    def setUp(self):
        # Do something here to disable the string translation. But what?
        # I've already tried this, but it didn't work:
        django.utils.translation.deactivate_all()
    def testFoobar(self):
        c = Client()
        response = c.get("/foobar")
        # I want to compare to the original string without translations.
        self.assertEquals(response.content.strip(), "Welcome to my site.")
4

3 に答える 3

13

テスト クライアントで.get()またはを呼び出すと、構成されたすべてのミドルウェアが実行されます。.post()これは、 も実行され、その後LocaleMiddlewareに が呼び出されることを意味します。translation.get_language_from_request()translation.activate(language)

これは、テスト クライアントを使用してテストを記述するときに、現在アクティブな言語が無視され、破棄されることを意味します。つまり、次のコードは機能しません。

def testFoobar(self):
    c = Client()
    # This will not work.
    translation.deactivate_all()
    # This will not work either.
    translation.activate('en-us')
    # The next call will override the earlier activate/deactivate calls.
    response = c.get("/foobar")

いくつかの解決策があります:

  1. セッション オブジェクトで目的の言語を設定します。
  2. Cookie で目的の言語を設定します。
  3. HTTP_ACCEPT_LANGUAGEヘッダーを送信しています。
  4. 設定settings.LANGUAGE_CODE

ソース (Django 1.4 からですが、1.1 以前からほとんど変更されていません):

于 2012-06-04T16:37:20.143 に答える
8

@Denilson Sáの回答から、アプローチ番号4でこの同じ問題を解決しました。これはテスト固有の設定ファイルを必要とせず、django が提供するデコレーターまたはコンテキストマネージャーを使用してテストごとに定義できることがわかりました (設定のオーバーライドを参照)。

次のように使用できます。

from django.test import TestCase, override_settings

class MyTest(TestCase):
    @override_settings(LANGUAGE_CODE='en-US', LANGUAGES=(('en', 'English'),))
    def test_mypage(self):
        // ...

デコレーターは、TestCase サブクラス全体に適用することもできます。また、さらにきめ細かい制御を行うために、コンテキスト マネージャーもあります (上記のリンクのドキュメントを参照してください)。

これは私にとってかなり一般的であるため、次のようにも定義しました。

english = override_settings(
    LANGUAGE_CODE='en-US',
    LANGUAGES=(('en', 'English'),),
)

@englishそのため、必要なテストケースで簡単に使用できます。

于 2016-01-10T06:58:08.137 に答える
1

言語を単体テストの既知の設定に強制する方が理にかなっていると思います。これは、実際の実装に近いものをテストしていることを意味します。

特定の言語をアクティブ化するには、セットアップでこれを行うことができます。

from django.utils.translation import activate
...
activate('en-en')
于 2012-05-31T18:51:29.737 に答える