Django переопределяет ОБЪЕКТ settings.py в unittest не работает

Существует приложение Django, использующее Django Rest Framework. Файл настроек содержит объект с настройками:

settings.py

REST_FRAMEWORK = {
    ...
    'DEFAULT_THROTTLE_RATES': {
        'burst': '30/second',
    },
    ...
}

Предполагается, что модульный тест проверяет, действительно ли работает дросселирование. Однако ни один из инструментов, предоставляемых тестовым модулем Django (SimpleTestCase.settings, override_settings, изменить_настройки), на самом деле не работает:

SimpleTestCase.settings

class ThrottlingTest(RestApiTestCase):
    def test_per_second_throttling(self):
        new_config = settings.REST_FRAMEWORK
        new_config['DEFAULT_THROTTLE_RATES']['burst'] = '1/second'
        with self.settings(REST_FRAMEWORK=new_config):
        for _ in range(0, 2):
            response = self.client.get(self.api_reverse('foo'))
        self.assertEqual(response.status_code, 429)  # fails, 200 != 429

override_settings

class ThrottlingTest(RestApiTestCase):
    new_config = settings.REST_FRAMEWORK
    new_config['DEFAULT_THROTTLE_RATES']['burst'] = '1/second'

    @override_settings(REST_FRAMEWORK=new_config)
    def test_per_second_throttling(self):
        for _ in range(0, 2):
            response = self.client.get(self.api_reverse('foo'))
        self.assertEqual(response.status_code, 429)  # fails, 200 != 429

Оба метода прекрасно работают для примитивных переменных и списков, но не работают с объектом.

В документах указано:

When given a class, these decorators modify the class directly and return it; they don’t create and return a modified copy of it.

Так что на самом деле предполагаемый работает.

Любые подсказки, как справиться с этим?

ну, для начала, если дросселирование является частью rest framework, вы не должны писать тесты для этого, это функция фреймворка, а фреймворк должен содержать тесты для этой функции.

Aarif 08.04.2019 09:57

Какой тип реализации дроссельной заслонки вы используете — AnonRateThrottle или один из других?

Will Keeling 08.04.2019 10:58

Используя эту реализацию: django-rest-framework.org/api-guide/дросселирование.

0leg 10.04.2019 09:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
413
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что на самом деле это ошибка/отсутствующая функция в Django REST Framework. Инструменты проверки настроек (SimpleTestCase.settings, override_settings, modify_settings) отправляют сигнал setting_changed и полагаются на каждый компонент для соответствующего обновления.

Django REST Framework делает прослушивает этот сигнал (источник), но это не влияет на скорость дросселирования, поскольку скорость дросселирования является атрибутом класса (источник).

При этом я согласен с @Aarif в том, что это не нужно тестировать, потому что у самого DRF есть тесты, охватывающие эту функцию.

Также обратите внимание, что вы изменяете существующий словарь настроек REST_FRAMEWORK. Вместо этого создайте копию:

new_config = settings.REST_FRAMEWORK.copy()

Другие вопросы по теме