Установка заголовков в тестах Django (управление версиями API) - PullRequest
0 голосов
/ 18 октября 2018

Я использую AcceptHeaderVersioning с каркасом отдыха Django, как описано здесь:

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

Я хочу проверить, что API возвращает версию по умолчанию, если версия не указана, но верная версия, когда она есть.Но, кажется, невозможно передать параметр версии в тест.Вот пример:

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 голосов
/ 19 октября 2018

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

В документации сказано, что вам необходимо включить версию в заголовок Accept,используя их пример:

Вот пример HTTP-запроса с использованием стиля управления версиями заголовка accept.

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

В приведенном выше примере атрибут request.version будетвернуть строку '1.0'.

Вы также неправильно установили заголовки в своем вызове self.client.get(), основываясь на документации Django https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META:

За исключениемCONTENT_LENGTH и CONTENT_TYPE, как указано выше, любые заголовки HTTP в запросе преобразуются в ключи META путем преобразования всех символов в верхний регистр, замены любых дефисов подчеркиванием и добавления префикса HTTP_ к имени.Так, например, заголовок с именем 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)
...