Вопрос по internationalization, testing, django – Язык по умолчанию через настройки, не соблюдаемые во время тестирования

5

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

Наличие особенно странной проблемы для отслеживания, связанной с интернационализацией, и RequestFactory vs. 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

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

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

б) нет.

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

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

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

ТвойLANGUAGE_CODE настройка выглядит недействительной.docs.djangoproject.com/en/1.3/ref/settings/#language-code Stan
Проверено а) и работает у меня с такими же версиями Python и Django. Остерегайтесь заказа промежуточного программного обеспечения. Stan
@kaptainlange Почему-то (а) у меня тоже не работает. С помощьюLocaleMiddleware а такжеLANGUAGE_CODE='en-us', когда я делаюreverse('my_name') я получилhttp://testserver/en-us/... тогда как этоhttp://127.0.0.1:8000/en/... на сервере. Additionaly,client.get() возвращает 404 сreverseв отличие от использования статического URL с/en/. Wtower
См. Правки выше, а) в этом случае не работает должным образом. б) Решает проблему, но все же очень любопытно, почему RequestFactory не соблюдает файл настроек. kaptainlange
0

если то же самое представление просто вызывается с результатом методов 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.

Похожие вопросы