Ожидаемое представление будет вызываться с аргументом ключевого слова URL с именем pk

Я пишу тест для представления Django Rest Framework, внимательно следуя документации по тестированию< /а>

Вот мой простой тест:

def test_patient_detail_api_opens(self):
    factory = APIRequestFactory()
    view =PatientDetailApi.as_view()
    request = factory.get(reverse('api_pacjent', kwargs={'pk' :1}))
    force_authenticate(request, user=self.user)
    response = view(request)
    self.assertEqual(response.status_code, 200)

Этот тест завершается с ошибкой со следующим сообщением:

AssertionError: Expected view PatientDetailApi to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

Я не понимаю, почему это происходит и как это исправить.

  • В URL-адресе есть pk kwargs,
  • согласно документам нет необходимости явно добавлять значение lookup-field, если по умолчанию оно равно pk,
  • представление открывается правильно, но этот тест не проходит...

Кто-нибудь может объяснить, почему возникает эта ошибка?

Вот соответствующий код:

"главный" url.py:

urlpatterns = [
    url(r'^pacjent/', include('pacjent.urls')),
] 

pacjent.urls выглядит так:

url(r'^api/szczegoly/(?P<pk>\d+)/$', PatientDetailApi.as_view(), name="api_pacjent"),

И PatientDetailApi это:

class PatientDetailApi(generics.RetrieveUpdateAPIView):
    model = Patient
    serializer_class = PatientDetailsSerializer
    queryset = Patient.objects.all()

    authentication_classes = (SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated,) 

person user1544500    schedule 23.01.2017    source источник
comment
Это работает, когда вы на самом деле запрашиваете API вне вашего теста, например, через Postman? Или если вы используете APIClient?   -  person Daniel Roseman    schedule 23.01.2017
comment
Оно делает. Это была недостающая часть, упомянутая Ремко Герлихом. Спасибо за ваше предложение!   -  person user1544500    schedule 23.01.2017
comment
@ user1544500 какой будет конечная точка API, если вы вызовете свой API из почтальона с именованным аргументом?   -  person Asad Manzoor    schedule 29.11.2019


Ответы (2)


Функции представления вызываются с запросом и аргументами из URL-адреса. Итак, передайте их:

response = view(request, pk=1)
person RemcoGerlich    schedule 23.01.2017
comment
OMG, я пытался добавить его в as_view, а затем в factory.get, потом пытался возиться с самим запросом... - person Csaba Toth; 22.03.2019

Я столкнулся с подобной ошибкой, когда по ошибке использовал метод get_object в Perform_create. Узнайте, почему это неправильно, из документация

perform_create(self,instance):
      instance = self.get_object()
person 7guyo    schedule 18.11.2019