Я пытаюсь написать простой модульный тест для представления, но у меня возникают проблемы с передачей дополнительных аргументов ключевого слова в представление, когда я использую RequestFactory для настройки запроса.
Для начала, вот urlpattern:
# app/urls.py
# Example URL: localhost:8000/run/user/1/foo
urlpatterns = [
url(r'^user/(?P<uid>\d+)/(?P<uname>\w+)/$',
views.user_kw,
name='user-kw'),
]
Вот представление, которое я тестирую:
# app/views.py
def user_kw(request, *args, **kwargs):
uid = kwargs['uid']
uname = kwargs['uname']
return render(request, 'run/user.html', context)
Наконец, вот тест:
# app/tests.py
def test_user_kw(self):
factory = RequestFactory()
# ???
request = factory.post('user/')
response = views.user_kw(request)
self.assertEqual(response.status_code, 200)
Как вы могли ожидать, когда я запускаю тест, я получаю эту ошибку:
======================================================================
ERROR: test_user_kw (run.tests.TestViews)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jones/code/django/testing/run/tests.py", line 53, in test_user_kw
response = views.user_kw(request, {"uid": 1, "uname": "foobar"})
File "/Users/jones/code/django/testing/run/views.py", line 28, in user_kw
uid = kwargs['uid']
KeyError: 'uid'
----------------------------------------------------------------------
Документация Django об объекте RequestFactory не обсуждает эту ситуацию. Я посмотрел на сам код RequestFactory, но не смог понять, как настроить объект для учета двух ключевых аргументов, содержащихся в URL. Я также не мог найти что-нибудь онлайн, решающее эту ситуацию.
Я должен добавить, что мне удалось написать тест для случая, в котором я использовал позиционные аргументы, и он работает:
def test_user_pos(self):
factory = RequestFactory()
request = factory.post('user/')
response = views.user_pos(request, 1, 'foo')
self.assertEqual(response.status_code, 200)
Я просто не могу понять, как переписать тест для аргументов ключевых слов. Возможно, я слишком долго смотрю на проблему, и ответ мне в глаза смотрит, но я просто не вижу ее.