如果客户端在setUpTestData()中初始化,则Django PUT TestCase失败,但是如果客户端在setUp()中初始化,则Django PUT TestCase通过

时间:2018-07-01 05:28:15

标签: django django-rest-framework tdd django-testing

我正在编写除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:DAPI Web api视图中的所有api,包括PUT都可以工作。

1 个答案:

答案 0 :(得分:0)

根据我的理解,并经过client以上的测试,它不是该类的实例属性,而是一个类属性,因此是错误响应。尝试在self.client方法和cls.client方法中将setUp更改为test_api_can_update_user。 同样,根据我的经验,建议在创建测试用例之前初始化client