簡體   English   中英

測試期間,“ DRF響應”內容類型設置為“無”

[英]DRF Response content-type set to None during tests

我正在使用Django Rest Framework(版本3.6.2)創建REST API。 我定義了從GenericViewSet繼承的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 (這是我可以在瀏覽器和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')
}

因此,似乎設置了正確的標頭,但並未填充到content_type屬性中。 我想念什么嗎?

這就是我測試內容類型的方法。 在極少數情況下,我的代碼決定內容類型本身,因此,我檢查自己個人沒有做錯什么。 DRF代碼已經過測試。

self.assertEqual("application/json", resp['Content-Type'])

您只需要依靠DRF正確地執行它,這不是您可以測試或不需要測試的事情。 例如,您沒有測試DRF是否正確解析了json主體。 測試服務器與真正的服務器並不完全相同,但是非常接近。 例如,您將從response.data中獲取真實對象,而不是json編碼/解碼對象。

如果需要,請LiveServerTestCase ,但是它會變慢。

我遇到了類似的情況,這對我有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM