Существует приложение Django, использующее Django Rest Framework. Файл настроек содержит объект с настройками:
settings.py
REST_FRAMEWORK = {
...
'DEFAULT_THROTTLE_RATES': {
'burst': '30/second',
},
...
}
Предполагается, что модульный тест проверяет, действительно ли работает дросселирование. Однако ни один из инструментов, предоставляемых тестовым модулем Django (SimpleTestCase.settings, override_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
Оба метода прекрасно работают для примитивных переменных и списков, но не работают с объектом.
В документах указано:
When given a class, these decorators modify the class directly and return it; they don’t create and return a modified copy of it.
Так что на самом деле предполагаемый работает.
Любые подсказки, как справиться с этим?
Какой тип реализации дроссельной заслонки вы используете — AnonRateThrottle
или один из других?
Используя эту реализацию: django-rest-framework.org/api-guide/дросселирование.
Я думаю, что на самом деле это ошибка/отсутствующая функция в Django REST Framework. Инструменты проверки настроек (SimpleTestCase.settings
, override_settings
, modify_settings
) отправляют сигнал setting_changed
и полагаются на каждый компонент для соответствующего обновления.
Django REST Framework делает прослушивает этот сигнал (источник), но это не влияет на скорость дросселирования, поскольку скорость дросселирования является атрибутом класса (источник).
При этом я согласен с @Aarif в том, что это не нужно тестировать, потому что у самого DRF есть тесты, охватывающие эту функцию.
Также обратите внимание, что вы изменяете существующий словарь настроек REST_FRAMEWORK
. Вместо этого создайте копию:
new_config = settings.REST_FRAMEWORK.copy()
ну, для начала, если дросселирование является частью
rest framework
, вы не должны писать тесты для этого, это функция фреймворка, а фреймворк должен содержать тесты для этой функции.