DRF APIClient删除数据到达request.data,而不是request.query_params

问题描述 投票:0回答:2

我使用DRF的APIClient来编写自动化测试。当is编写第一个删除测试时,我发现很奇怪,传递的数据到达request.data,而如果我使用axios或postman,它总是到达request.query_params。 任何关于为什么会这样的解释,最好是在数据到达 query_params 时使用 APIClient.Delete 的方法都会很棒!

我的测试:

import pytest
from rest_framework.test import APIClient


@pytest.fixture()
def client():
    client = APIClient()
    client.force_authenticate()
    yield client


class TestDelete:

    def test_delete(client):
        response = client.delete('/comment', data={'team': 0, 'id': 54})

还有我的看法

from rest_framework.views import APIView



class Comments(APIView):

    def delete(self, request):
        print(request.query_params, request.data)


>>> <QueryDict: {}> <QueryDict: {'team': ['0'], 'id': ['54']}>

研究了 DRF 的 APIClient。向参数提供信息似乎没有帮助。删除方法似乎没有直接的参数可以提供帮助。所以我有点卡住了。

django django-rest-framework pytest
2个回答
1
投票

虽然已经提出了一些好的选项,但它们不适用于 DRF 的 APIView。我最终使用

urllib
并手动编码:

import pytest
from urllib.parse import urlencode
from rest_framework.test import APIClient


@pytest.fixture()
def client():
    client = APIClient()
    client.force_authenticate()
    yield client


class TestDelete:

    def test_delete(client):
        response = client.delete(f'/comment{urlencode(data)}')


0
投票

同样方法的参考代码。此代码也适用于 Django/DRF:

from urllib.parse import urlencode

from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework.test import APIClient

class TestA(APITestCase):
    def test_A(self):
        client = APIClient()
        query_params = {
            'paramA': 'valueA',
            'paramB': 'valueB',
        }
        url = reverse('xxx')
        url = url + '?' + urlencode(query_params)
        res = self.client.delete(url)
© www.soinside.com 2019 - 2024. All rights reserved.