【发布时间】:2019-04-08 07:39:43
【问题描述】:
有使用 Django Rest Framework 的 Django 应用程序。设置文件包含一个具有设置的对象:
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
这两种方法都适用于原始变量和列表,但对于对象却失败了。
文档状态:
当给定一个类时,这些装饰器直接修改该类并返回它;他们不会创建并返回它的修改副本。
所以它实际上应该工作。
任何线索如何处理?
【问题讨论】:
-
对于初学者来说,如果限制是
rest framework的一部分,你不应该为此编写测试,这是框架的特性,框架应该包含针对该特性的测试。 -
您正在使用哪种类型的速率限制实现 -
AnonRateThrottle或其他之一?
标签: python django django-rest-framework django-unittest