Django переопределяет settings.py OBJECT в unittest не работает - PullRequest
0 голосов
/ 08 апреля 2019

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

settings.py

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

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

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

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

Состояние документов:

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

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

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

1 Ответ

1 голос
/ 08 апреля 2019

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

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

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

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

new_config = settings.REST_FRAMEWORK.copy()
...