Как мне переписать одно значение в настройках для теста - PullRequest
0 голосов
/ 27 августа 2018

Как мне переписать «пользователь»: «5 / минута» на «пользователь»: «2 / день» в настройках теста

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
         'user': '5/minute'
    }
}

Как я могу сделать это с @override_settings или МБ с управлением контекстом? Мне нужно применить это только в одном тесте, я не могу переписать весь словарь

def test_mytest(self):
    value = settings.REST_FRAMEWORK
    value['DEFAULT_THROTTLE_RATES'] = {'user':'2/day'}

    data1 = {}
    data2 = {}
    data3 = {}

with self.settings(REST_FRAMEWORK=value):
    resp1 = self.client.post(self.url, data1, format='json')
    resp2 = self.client.post(self.url, data1, format='json')
    resp3 = self.client.post(self.url, data1, format='json')

assert resp3.status_code == 429, resp3.data

Но нет ошибки 429, хотя значение изменилось

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

В зависимости от вашего варианта использования вы можете воспользоваться одним из следующих способов:

Предложение 1: Если вы хотите переопределить настройки в нескольких конкретных тестовых случаях Вы можете использовать @override_settings декоратор.Но это не имеет смысла, если вы хотите, чтобы это было для всех тестовых случаев, если это так, тогда вы можете следовать предложению 2.

Предложение 2: Это более общее и эффективное решение.

У вас может быть несколько файлов настроек для различных запущенных сред (внутри модуля настроек Python) что-то вроде этого:

  1. base.py (содержит все ваши основные настройки)
  2. local.py (импорт * из базы здесь и переопределение / добавление настроек, специфичных для локальной среды / dev)
  3. test.py (импорт * из базы здесь и переопределение / добавление настроек, специфичных для тестовой среды)
  4. Вы также можете иметь параметры, специфичные для производственной среды, в prod.py или в каком-либо другом виде.

С помощью этой настройки можно запускать тесты, такие как python manage.py test --settings=yourproject.settings.test

0 голосов
/ 27 августа 2018

Решение 1 : с упаковкой @override_default()

Вы хотите применить функцию-оболочку к viewset, которую хотите переопределить этим значением:

from rest_framework.throttling import UserRateThrottle

class UserViewSet(viewsets.ViewSet):

    @api_view(['PUT'])
    @throttle_classes([UserRateThrottle])
    @override_settings(REST_FRAMEWORK['DEFAULT_THROTTLE_RATES']['user'] = "2/day")
    def update(self, request, pk=None):
        ...

Добавьте оболочку перед любым представлением или набором изображений, к которому вы хотите применить эту переопределенную таможенную стоимость.

Вы также хотите это в своем settings.py:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '13500/day'
    }
}

Решение 2 : пользовательский класс регулирования

Однако, если вы хотите использовать разные скорости регулирования для тестовой среды, попробуйте следующее в settings.py:

TEST = True ## <-- Set to False when not in testing!!

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.CustomUserRateThrottle'
    )
}

И назначьте свой собственный класс регулирования:

from django.conf import settings

class CustomUserRateThrottle(throttling.UserRateThrottle):
    if settings.TEST:
        THROTTLE_RATES = 'DEFAULT_THROTTLE_RATES': {
            'user': '13500/day',
        }
    else:
        THROTTLE_RATES = 'DEFAULT_THROTTLE_RATES': {
            'user': '2/day',
        } 
    return settings.TEST # <-- Custom throttling classes must always return either True or False, so this makes sense.

Решение 3 : прямо в вашей "тестовой оболочке":

Включите вашу пользовательскую оболочку, как мы определили выше, но на этот раз в ваш метод test_something() в test.py:

from django.conf import settings
from django.test import TestCase

class TestCase(TestCase):

    def test_something(self):

       with self.settings(REST_FRAMEWORK = ['DEFAULT_THROTTLE_RATES']['user'] = '13500/day'):


       # START TESTING HERE WITH TEST SETTINGS
...