#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()