Как передать дополнительные ключевые аргументы при использовании Django RequestFactory? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь написать простой модульный тест для представления, но у меня возникают проблемы с передачей дополнительных аргументов ключевого слова в представление, когда я использую 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)

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

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете передать ключевые аргументы методу user_pos обычным способом:

response = views.user_kw(request, uid=1, uname='foo')

Ваше сообщение об ошибке показывает, что вы пытались:

response = views.user_kw(request, {"uid": 1, "uname": "foobar"})

Это не передача аргументов ключевых слов, это передача словаря в качестве позиционного аргумента. Обратите внимание, что вы можете использовать ** для распаковки словаря:

response = views.user_kw(request, **{"uid": 1, "uname": "foobar"})
...