Отключить переводы для unittest

У меня есть код Python, например

from pylons.i18n.translation import _

def get_message():
     message = _(u"Translated message")
     # interesting code to test
     # [...]
     return 'result'

который я хотел бы протестировать следующим образом:

class MyTest(TestCase):
    def test_get_message(self):
        assertTrue(get_message(), 'result')

Теперь запуск этого теста в Nosetests дает мне:

TypeError: No object (name: translator) has been registered for this thread

Есть ли способ деактивировать что-либо в отношении переводов при модульном тестировании?


person Thorben Croisé    schedule 28.05.2015    source источник
comment
Вы пытались издеваться над функцией _()?   -  person Milo    schedule 28.05.2015
comment
Этот фрагмент кода выше — ваш производственный код, верно? Какой у вас тестовый код?   -  person Milo    schedule 28.05.2015
comment
Ну, этот код — упрощенный пример… какое это имеет значение? Я все же отредактировал вопрос.   -  person Thorben Croisé    schedule 28.05.2015
comment
@mocking: не могли бы вы объяснить, как указать get_message() использовать макет вместо pylons.i18n.translation._?   -  person Thorben Croisé    schedule 28.05.2015


Ответы (1)


Допустим, ваш производственный код находится в my_module.py:

from unittest import TestCase
from mock import patch
from my_module import get_message


class MyTest(TestCase):
    def test_get_message(self):
        with patch("my_module._"):
            result = get_message()
            self.assertEqual("result", result)

С помощью patch ваш тест изменяет функцию _() на объект MagicMock(). Документация здесь.

ПРИМЕЧАНИЕ. mock является частью стандартной библиотеки, начиная с Python 3.3 и выше. В противном случае вы должны сначала установить его, используя pip install mock.

person Milo    schedule 28.05.2015
comment
Выглядит хорошо, но помимо упрощенных вопросов это создаст много проблем, если _ ничего не возвращает... как заменить его функцией, которая просто возвращает строку? Я так понимаю патч только патчит классы?! - person Thorben Croisé; 28.05.2015
comment
with patch("my_module._", return_value='Not important') по крайней мере удостоверится, что возвращает строку. - person Thorben Croisé; 29.05.2015