Обновление : Решил мою собственную проблему : я узнал, что Django создает свою собственную тестовую базу данных, и поэтому она должна быть заполнена данными. Запустил моего импортера в моих тестовых случаях, и все заработало. Итак, если вам также интересно, почему ваши тесты не работают, убедитесь, что у вас есть некоторые данные в тестовой базе данных! Завершить обновление
Я пишу тесты для моего Django Rest Framework API, но я изо всех сил пытаюсь заставить мой код вернуть 200 OK. В данный момент мой тестовый случай постоянно возвращает 404. Not Found.
Я нахожусь на ранних стадиях написания тестов, и мне есть чему поучиться. В настоящее время я следую https://www.django -rest-framework.org / api-guide / testing /
Я пытаюсь проверить конечную точку по следующему URL
# Not shown here, is that all URLs here will be prepended with /api/v1
path('case/<int:pk>/', EntireCaseView.as_view(), name='case'),
У меня есть объект в моей базе данных с идентификатором (первичным ключом), равным 1. Я могу успешно запросить API, перейдя к http://localhost:8000/api/v1/case/1/
Я получу действительный ответ JSON (Trampe - кролик))
{
"id": 1,
"total_points": 5000,
"passing_points": 3700,
"budget": 5000,
"description": "Saving Trampe from Trauma",
"name": "Trampe",
"signalment": "8yr, intact male, mixed breed.",
"problem": "Respiratory difficulty",
"image": {
"id": 1,
"file": "http://localhost:8000/media/images/trampe.jpg",
"description": "A lovely picture of Trampe"
},
Мой API требует аутентификации, и поэтому я предоставляю аутентификацию в моем тестовом примере.
class CaseTests(APITestCase):
def test_status_code(self):
"""
ensure that case/1 returns 200 OK
"""
# Create a test user
test_user = User(username='jim', password='monkey123', email='jim@jim.com')
test_user.save()
# build a factory and get our user Jim
factory = APIRequestFactory()
user = User.objects.get(username='jim')
# Get our view to test and the url, too
view = EntireCaseView.as_view()
url = reverse('case', kwargs={'pk': '1'})
print(url.__str__())
# Make an authenticated request to the view...
request = factory.get(url)
print(request.get_full_path())
force_authenticate(request, user=user)
response = view(request, "1")
print(response.data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
Здесь интересуют (по крайней мере для меня) строки url = reverse('case', kwargs={'pk': '1'})
и response = view(request, "1")
Если я пропущу аргумент kwargs
в url =r everse('case', kwargs={'pk': '1'})
или "1"
в response = view(request, "1")
, я получу сообщение об ошибке, в котором говорится, что метод get () требует 2 позиционных аргументано только с учетом.
Вот подпись метода get (), на мой взгляд.
class EntireCaseView(APIView):
def get(self, request, pk):
Если я запускаю свой тест, Django сообщает, что он не работает из-за 404.
self.assertEqual(response.status_code, status.HTTP_200_OK)
AssertionError: 404 != 200
Я пытаюсь понять, почему это так. Печать print(url.__str__())
выводит /api/v1/case/1/
, как и print(request.get_full_path())
Итак, в общем, я пытаюсь понять, почему я получаю эти 404 и, в конечном счете, как я могу проверить это и другие конечные точки.
Любая помощь приветствуется.
Приветствия, C