テストと国際化に問題があります。
- プロジェクトはDjango 1.11です
- パイソン3.5
- cookiecutter-django で作成されたプロジェクト
settings.py の国際化コード:
TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = [
('en', _('English')),
('fr', _('French')),
('es', _('Spanish')),
('de', _('German')),
]
ユーザーの標準 Cookiecutter テストで pytest を実行すると、i18n_patterns を追加せずに正常に完了します。URL が次のように更新されると、次のようになります。
urlpatterns += i18n_patterns(
....
# User management
url(r'^accounts/', include('allauth.urls')),
url(r'^users/', include('users.urls', namespace='users')),
....
)
URL テストは失敗します。出力は次のようになります。
======================================================================
FAIL: test_get_redirect_url (users.tests.test_views.TestUserRedirectView)
----------------------------------------------------------------------
Traceback (most recent call last):
File "users/tests/test_views.py", line 33, in test_get_redirect_url
'/users/testuser/'
AssertionError: '/en-us/users/testuser/' != '/users/testuser/'
- /en-us/users/testuser/
? ------
+ /users/testuser/
ご覧のとおり、問題は /en-us/ が URL で使用されているプレフィックスであることです。ここで、アサーションに /en-us/ を追加することでこれを修正できます。ただし、/en-us/ プレフィックスは正しくありません。これは言語コードであり、設定ファイルに示されている通常の言語プレフィックスではありません。
テスト以外で、runserver を使用して、/users// の URL に移動すると、/en-us/ ではなく /en/ で始まります
では、大きな問題は、i18n_patterns() が /en/ を使用するときに、なぜテストの前に /en-us/ を付けるのですか?
編集 users/tests/test_urls.py の内容は次のとおりです
from django.core.urlresolvers import reverse, resolve
from test_plus.test import TestCase
class TestUserURLs(TestCase):
"""Test URL patterns for users app."""
def setUp(self):
self.user = self.make_user()
def test_list_reverse(self):
"""users:list should reverse to /users/."""
self.assertEqual(reverse('users:list'), '/users/')
def test_list_resolve(self):
"""/users/ should resolve to users:list."""
self.assertEqual(resolve('/users/').view_name, 'users:list')
def test_redirect_reverse(self):
"""users:redirect should reverse to /users/~redirect/."""
self.assertEqual(reverse('users:redirect'), '/users/~redirect/')
def test_redirect_resolve(self):
"""/users/~redirect/ should resolve to users:redirect."""
self.assertEqual(
resolve('/users/~redirect/').view_name,
'users:redirect'
)
def test_detail_reverse(self):
"""users:detail should reverse to /users/testuser/."""
self.assertEqual(
reverse('users:detail', kwargs={'username': 'testuser'}),
'/users/testuser/'
)
def test_detail_resolve(self):
"""/users/testuser/ should resolve to users:detail."""
self.assertEqual(resolve('/users/testuser/').view_name, 'users:detail')
def test_update_reverse(self):
"""users:update should reverse to /users/~update/."""
self.assertEqual(reverse('users:update'), '/users/~update/')
def test_update_resolve(self):
"""/users/~update/ should resolve to users:update."""
self.assertEqual(
resolve('/users/~update/').view_name,
'users:update'
)