Тестовые случаи для Django Rest Framework;изо всех сил, чтобы получить правильный ответ - PullRequest
1 голос
/ 19 октября 2019

Обновление : Решил мою собственную проблему : я узнал, что 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

...