Язык по умолчанию через настройки, не соблюдаемые во время тестирования - PullRequest
6 голосов
/ 12 марта 2012

Использование Django 1.3, Python 2.6

Наличие особенно странной проблемы для отслеживания, связанной с интернационализацией, и RequestFactory против TestClient для тестирования представлений.

Если я запускаю:

./manage.py test 

Все тесты запускаются (включая проблемные) и проходят успешно.Если я запускаю:

./manage.py test <appname> 

Тесты приложения не пройдут, и будет выдано исключение отрисовки шаблонов для шаблонов, использующих код языка, потому что язык, по мнению django, запрашиваемый запрос не является языком, который мы перечислили вsettings.LANGUAGES.(В данном случае это всегда был «en-us», язык соответствия шкафу, который мы поддерживаем, был «en»)

Вот пример теста, который не пройдёт:

class TemplateServingTestCase(TestCase):
    def setUp(self):
        self.app_dir      = os.path.abspath(os.path.dirname(__file__))
        self.gallery_root = os.path.join(self.app_dir, 'test_gallery')
        self.gallery_url  = '/'
        self.request      = RequestFactory().get('/')

    def test_404_invalid_category(self):
        self.assertRaises(Http404, gallery_page,
            self.request,
            'bad-category',
            self.gallery_root,
            self.gallery_url
        )

Эта проблема не будет возникать, если django TestClient используется для отправки запроса на URL, который вызывает конкретное представление.Однако, если то же самое представление просто вызывается с результатом методов get или put RequestFactory, оно выдаст ошибку выше.

Похоже, что при использовании метода RequestFactory файл настроек не соблюдается.Я что-то упускаю здесь просто?

Дополнительная информация

Применимые языковые настройки

LANGUAGE_CODE = 'en'
LANGUAGES = (
    ('en', 'English'),
    ('de', 'Deutsch'),
    ('es', 'Espanol'),
    ('fr', 'Francaise'),
    ('it', 'Italiano'),
    ('pt-br', 'Portugues (Brasil)'),
)

Активное промежуточное ПО

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'services.middleware.LegacyIntegrationMiddleware',
)

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Есть 2 возможности:

a) У вас есть 'django.middleware.locale.LocaleMiddleware' в настройках. MIDDLEWARE_CLASSES.

В этом случае клиент использует settings.LANGUAGE_CODE.

b.Вы не делаете.

В этом случае вы должны установить такой же язык в модуле tests.py:

from django.utils.translation import activate
...
activate('fr-fr')

https://code.djangoproject.com/ticket/15143

0 голосов
/ 02 августа 2016

Однако, если то же самое представление просто вызывается с результатом методов get или put RequestFactory, оно выдаст ошибку выше.

Я полагаю, вы делаете что-то вроде:

from django.utils import translation
from app.views import some_view

# Using translation.activate is pretty well known, so I suppose you
# also do this:
translation.activate(<whatever language you want>)

request_factory = RequestFactory()
request = request_factory.get("/foo")

response = some_view(request)

Тогда URL-адреса, сгенерированные запросом, будут иметь None вместо желаемого языка. Вы можете попробовать использовать URL с языковым префиксом. Вы можете попробовать установить языковой куки в вашем запросе. Вы можете попробовать поиграть с сессией. Ничего не работает.

Причина не работает в том, что вы обходите весь механизм промежуточного программного обеспечения . Вы вызываете вид напрямую. Джанго не будет вмешиваться, принять запрос и передать его через промежуточное ПО.

То, что вы можете сделать, это вызвать любое промежуточное программное обеспечение, которое вам нужно, или вы можете повторить то, что делает промежуточное программное обеспечение. Чтобы получить запрос, созданный с помощью RequestFactory для соблюдения языковых настроек, я выбрал последний и сделал следующее:

translation.activate("en-us")
request.LANGUAGE_CODE = "en-us"
response = some_view(request)

Этого было достаточно, чтобы добавить префикс языка к моим URL-адресам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...