mat*_*szb 0 python django json django-rest-framework django-rest-viewsets
我正在使用Django Rest Framework(版本3.6.2)创建REST API。我定义了继承自GenericViewSet并具有重写retrieve方法的视图集,以实现自定义行为。
class FooViewSet(viewsets.GenericViewSet):
serializer_class = FooSerializer
def retrieve(self, request, *args, **kwargs):
...
serializer = self.get_serializer(data)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
我想在从浏览器访问此端点时拥有BrowsableAPI,并json在从代码访问该端点时接收响应。我已使用以下设置配置了DRF:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'TEST_REQUEST_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
'TEST_REQUEST_DEFAULT_FORMAT':'json'
}
Run Code Online (Sandbox Code Playgroud)
一切正常,我可以从浏览器访问可浏览的API,使用Postman工具发出请求时,我会得到json响应。不幸的是,在测试期间我无法获得相同的结果。
class GetFooDetailViewTest(APITestCase):
def test_get_should_return_json(self):
response = self.client.get(self.VIEW_URL)
self.assertEqual(response.content_type, "application/json")
Run Code Online (Sandbox Code Playgroud)
我希望响应将content_type设置为application/json(这是我可以在浏览器和Postman的响应中看到的标头)。但是此测试失败- response.content_type设置为None。在调试该测试时,我发现response._headers字典看起来像这样
{
'vary': ('Vary', 'Cookie'),
'x-frame-options': ('X-Frame-Options', 'SAMEORIGIN'),
'content-type': ('Content-Type', 'application/json'),
'allow': ('Allow', 'GET, PUT, DELETE, OPTIONS')
}
Run Code Online (Sandbox Code Playgroud)
因此,似乎设置了正确的标头,但没有将其填充到content_type属性中。我想念什么吗?
这就是我测试内容类型的方法。在极少数情况下,我的代码决定内容类型本身,因此,我检查自己个人没有做错什么。DRF代码已经过测试。
self.assertEqual("application/json", resp['Content-Type'])
Run Code Online (Sandbox Code Playgroud)
您只需要依靠DRF正确地执行它,这不是您可以测试或不需要测试的事情。例如,您没有测试DRF是否正确解析了json主体。测试服务器与真正的服务器并不完全相同,但是非常接近。例如,您将从response.data中获取真实对象,而不是json编码/解码对象。
如果需要,请签出LiveServerTestCase,但是它会变慢。
| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |