测试期间DRF响应内容类型设置为“无”

时间:2017-08-15 12:11:22

标签: python json django 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)

我想在浏览器访问此端点时拥有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'
}

一切都按预期工作,我可以从浏览器访问可浏览的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")

我希望响应将content_type设置为application/json(这是我在浏览器和邮递员的回复中可以看到的标题)。但是此测试失败 - 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')
}

所以似乎设置了正确的标头,但它没有填充到content_type属性。我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

这是我测试内容类型的方法。在极少数情况下,我的代码决定内容类型本身,所以我要检查我个人没有做错什么。 DRF代码已经过测试。

cv::Ptr<SURF> detector = FeatureDetectorCreator<SURF>();

你必须依靠DRF做正确的事,这不是你能够或需要测试的东西。例如,您没有测试DRF正确解析了您的json正文。测试服务器与真实服务器完全不同,但它非常接近。例如,您将从response.data中获取真实的对象,而不是json编码/解码的对象。

如果需要,请查看LiveServerTestCase,但速度会慢一些。

答案 1 :(得分:1)

我遇到了类似的情况,这对我有用:

response = self.client.get(self.VIEW_URL, HTTP_ACCEPT='application/json')