我使用的是djangorestframework==3.3.3
和Django==1.9.4
我有一个测试,我想检查查询参数是否被正确处理。
class TestResourceView(APITestCase):
def test_view_process_query_params_correctly(self):
client = APIClient()
client.login(username='<username>', password='password')
response = client.get('/api/v2/resource/1/users/?fields=first_name;last_name')
self.assertEqual(response.status_code, 200)
# .... rest of the test ....
在我的视图中,我放入print
语句只是为了查看查询参数是否被正确解析,但我得到的查询字典为空:
class Resource(APIView):
def get(self, request):
query_params = request.query_params
print('Printing query params')
print(query_params)
# .... rest of the code ....
def post(self, request):
query_params = request.query_params
print('Printing query params')
print(query_params)
# .... rest of the code ....
运行测试时导致终端:
Printing query params
<QueryDict: {}>
同时,如果我像这样测试post
请求:
response = client.post('/api/v2/resource/1/users/?fields=first_name;last_name')
我得到了不正确的参数解析:
Printing query params
<QueryDict: {'last_name': [''], 'fields': ['first_name']}>
使用APIClient
的正确方法是什么?或者这仍然是一个bug?因为已经有类似的issue
发布于 2019-12-12 22:04:33
对我来说,问题是DRF需要的是data
中的参数,而不是像Django测试客户端那样的args
。
这个答案帮助了我:https://stackoverflow.com/a/45183972/9512437
class AccountTests(APITestCase):
def setUp(self):
self.user = CustomUser.objects.create_user(email="user1@test.com", password="password1", is_staff=True)
self.client = APIClient()
def test_add_name(self):
self.client.force_authenticate(self.user)
url = reverse('customuser-detail', args=(self.user.id,))
data = {'first_name': 'test', 'last_name': 'user'}
response = self.client.put(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
发布于 2016-07-14 19:45:04
查询参数的格式不正确。
如果你希望结果是{'fields': ['last_name', 'first_name']}
,那么你的帖子url应该是.../users/?fields=first_name&fields=last_name'
。您可能希望使用getlist()访问参数。
发布于 2016-07-15 09:59:58
1)关于client.get('/api/v2/resource/1/users/?fields=first_name;last_name')
中的空<QueryDict: {}>
-我的代码中有错误。我有两个同名的测试,其中一个的<QueryDict: {}>
确实是空的。因此,在运行测试时,django使用<QueryDict: {}>
运行测试
2)关于client.post('/api/v2/resource/1/users/?fields=first_name;last_name')
中查询参数的错误解析,我发现了以下discussion。所以,django基本上遵循HTTP标准,其中说;
分号是保留字符,如果使用,那么正确的方式理解它与&
相同。这里有更多details
https://stackoverflow.com/questions/38380674
复制相似问题