Django PUT TestCase завершается ошибкой, если клиент инициализируется в setUpTestData (), но проходит, если клиент инициализируется в setUp () - PullRequest
0 голосов
/ 01 июля 2018

Я пишу тесты, где проходит каждый тест, кроме PUT

from django.test import TestCase
from rest_framework.test import APIClient


class ViewTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.client = APIClient()

    def setUp(self):
        """setUp() runs before every single test method."""
        self.user_data = {'first_name': "John", 'last_name': "Doe", 'email_id': "john@doe.com",
                          'phone_number': "987654321", 'is_verified': False}
        self.response = self.client.post(
            reverse('create'),
            self.user_data,
            format='json')

    def test_api_can_update_user(self):
        user = User.objects.get()
        changes = {'first_name': "Johnny"}
        changed_user_data = {**self.user_data, **changes}

        response = self.client.put(
            reverse('details', kwargs={'email': user.email_id}),
            changed_user_data,
            format='json')

        self.assertEqual(response.status_code, status.HTTP_200_OK)

Этот тестовый пример завершается неудачно с response.status_code = 415 (неподдерживаемый тип носителя) тогда как, если я просто переместлю инициализацию клиента из setUpTestData () в setUp () все проходит.

    def setUp(self):
        self.client = APIClient()   # Test case passed now.
        ...

Существуют другие тесты для GET, POST, DELETE, которые все проходят независимо от того, является ли экземпляр клиента общим (setUpTestData) или нет.

PS: все API, включая PUT, работают из представления DRF Web API.

1 Ответ

0 голосов
/ 01 июля 2018

Насколько я понимаю, и с вашим тестом выше client не является атрибутом экземпляра класса, а является атрибутом класса, поэтому возникает ответ об ошибке. Попробуйте изменить self.client на cls.client в вашем методе setUp и test_api_can_update_user. Также по моему опыту желательно инициализировать client перед созданием тестовых случаев.

...