在Django测试中设置标头(API版本控制)

时间:2018-10-18 16:29:08

标签: django django-rest-framework django-testing

我将Django Rest框架与AcceptHeaderVersioning结合使用,如下所述:

{{3}}

如果未指定任何版本,但指定了正确的版本,我想测试API是否返回默认版本。但是,似乎不可能将version参数传递给测试。这是一个示例:

def testCheckVersion(self):
    versions = [u'v0.1', u'v0.2']
    self.key = APIKey(name='Example Key')
    self.key.save()
    for version in versions:
        response = self.client.get('/api/data/',
                                   VERSION="{0}".format(version),
                                   **{'Api-Key': self.key.key})
        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(content['api_version'], version)

这总是提供默认的api版本(在这种情况下为v0.2)。我尝试了各种方法来重新制作response =行,但是没有运气。可以通过改用QueryParameterVersioning来解决此问题,但我宁愿不这样做,因此,如果您有任何建议,请告诉我。

1 个答案:

答案 0 :(得分:0)

https://www.django-rest-framework.org/api-guide/versioning/#acceptheaderversioning

文档说,您需要使用其示例在Accept标头中包括该版本:

  

这是一个使用accept标头版本控制样式的HTTP请求示例。

GET /bookings/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
  

在上面的示例请求中,request.version属性将返回字符串'1.0'。

根据Django文档https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META,您在self.client.get()调用中还没有正确设置标题:

  

除上面给出的CONTENT_LENGTH和CONTENT_TYPE外,通过将所有字符都转换为大写字母,用下划线替换所有连字符,并在名称中添加HTTP_前缀,将请求中的所有HTTP标头都转换为META键。因此,例如,一个名为X-Bender的标头将被映射到META键HTTP_X_BENDER。

您得到的测试应该看起来像这样:

def testCheckVersion(self):
    versions = [u'v0.1', u'v0.2']
    self.key = APIKey(name='Example Key')
    self.key.save()
    for version in versions:

        ### This call has changed
        response = self.client.get(
            '/api/data/',
            HTTP_ACCEPT=f"application/json; version={version}"
        )

        self.assertEqual(response.status_code, 200)
        content = json.loads(response.content)
        self.assertEqual(content['api_version'], version)