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

#python #django #django-rest-framework #django-unittest

#python #django #django-rest-framework #django-unittest

Вопрос:

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

settings.py

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

Предполагается, что unittest проверяет, что регулирование действительно работает. Однако ни один из инструментов, предоставляемых тестовым модулем Django (SimpleTestCase.settings, override_settings, modify_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
  

переопределение_установок

 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
  

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

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

Когда задается класс, эти декораторы изменяют класс напрямую и возвращают его; они не создают и не возвращают его измененную копию.

Так что это действительно должно работать.

Есть какие-либо подсказки, как с этим справиться?

Комментарии:

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

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

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

Ответ №1:

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

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

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

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

 new_config = settings.REST_FRAMEWORK.copy()