2

次のコードを検討してください。

def get_some_text():
    return _(u"We need this text here")

関数がこれを返すことを確認する単体テストを作成する最良の方法は何ですか?Babelによって参照および変換された文字列?

この単純なコードには参照が含まれていないため、これは実際には別の「バベル文字列」です。

def test_get_some_text(self):
    self.assertEqual(get_some_text(), _(u"We need this text here"))
4

1 に答える 1

2

フラスコバベルを使用していて、モックを使用してもかまわず、何_が返されるかのみをテストする (つまりget_some_text、 の結果に対して追加の変換を行わない_) 場合は、 の戻り値をモックして、それを_テストできます。あなたはあなたが期待するものを手に入れます:

import mock


@mock.patch('gettext.ugettext')
def test_get_some_text(self, mock_ugettext):
  mock_ugettext.return_value = u'Hello World'

  self.assertEqual(get_some_text(), u'Hello World')

hereからの_呼び出しはわかっています。直前に行をドロップすると、Python シェルにジャンプして を呼び出し、この回答を使用して のインポート パスを見つけることができます。ugettextimport ipdb; ipdb.set_trace()get_some_textugettextgettext.ugettext

babel のみを使用していて、翻訳ディレクトリへのパスがわかっている場合は、テスト用に独自の翻訳を作成できる場合があります。

import os
import shutil

import polib    


os_locale = ''
translations_directory = '/absolute/path/to/your/translations'
# choose a locale that isn't already in translations_directory
test_locale = 'en_GB'

def setUp(self):
    mo_file_path = os.path.join(
        translations_directory,
        test_locale,
        'LC_MESSAGES',
        'messages.mo'
    )
    mo = polib.MOFile()
    entry = polib.MOEntry(
        msgid=u'We need this text here',
        msgstr='My favourite colour is grey'
    )
    mo.append(entry)
    mo.save(mo_file_path)

    # modify our locale for the duration of this test
    os_locale = os.environ.pop('LANG', 'en')
    os.environ['LANG'] = test_locale

def tearDown(self):
    # restore our locale
    os.environ['LANG'] = os_locale
    shutil.rmtree(os.path.join(translations_directory, test_locale))

def test_get_some_text(self):
    self.assertEqual(get_some_text(), u'My favourite colour is grey')
于 2015-08-01T21:05:07.327 に答える