首页 > 解决方案 > POST 正文未与 APIClient DRF 一起发送

问题描述

我对 Django 还很陌生,并且有扎实的背景Laravel(如果你碰巧做了一个很棒的类比)

我正在尝试将身体传递到终点,但我无法做到。

我试过了:

fake = Faker('pt_PT')
fake.add_provider(company)
client = APIClient()


class CompanyPostTestCase(APITestCase):
    def setUp(self):
        self.email = fake.email()
        self.username = str(fake.company()).split()[0]
        self.valid_payload = {
            'email': self.email,
            'password': '123',
            'username': self.username
        }

    def test_company_was_created(self):
        response = self.client.post('/v1/company/',
                                    self.valid_payload,
                                    # Also tried with content_type='application/json'
                                    format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

但是在调试模式下执行时,response对象POST内部_closable_objectsQueryDict: {}我假设没有body指定。错误消息还说b'{"message":"You must provide a password"}'清楚地表明没有传递正文。

通过 Postman,我可以提出相同的请求并Company毫无问题地创建一个。

任何想法都可以解决这样的问题。

编辑 我也试过valid_payload直接传递给client.post()这样的:

response = client.post('/v1/company/', data={
                                   'email': self.email,
                                   'password': '123',
                                   'username': self.username
                               },
                               format='json')

之后仍然无法工作

标签: djangodjango-rest-framework

解决方案


客户端不是CompanyPostTestCase可能导致问题的一部分。初始化内部函数应该可以解决问题。

class CompanyPostTestCase(APITestCase):
    def setUp(self):
        self.email = fake.email()
        self.username = str(fake.company()).split()[0]
        self.valid_payload = {
            'email': self.email,
            'password': '123',
            'username': self.username
        }



    def test_company_was_created(self):
        client = APIClient()
        response = client.post('/v1/company/',
                                    self.valid_payload,
                                    format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

推荐阅读