有一个Django应用程序使用Django Rest框架。设置文件包含具有以下设置的对象:
设置.py
REST_FRAMEWORK = {
...
'DEFAULT_THROTTLE_RATES': {
'burst': '30/second',
},
...
}
unittest应该测试节流的实际工作情况。然而,Django测试模块(SimpleTestCase.settings,override_settings,modify_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.
所以它实际上应该起作用。你知道吗
有线索怎么处理吗?你知道吗
我认为这实际上是Django REST框架中的一个bug/缺失特性。设置测试工具(
SimpleTestCase.settings
、override_settings
、modify_settings
)发出一个setting_changed
信号,并依赖每个组件进行相应的更新。你知道吗Django REST框架确实侦听这个信号(source),但是这对节流速率没有影响,因为节流速率是一个类属性(source)。你知道吗
也就是说,我同意@Aarif的说法,因为DRF本身有覆盖这个特性的测试。你知道吗
另外,请注意,您正在修改现有的
REST_FRAMEWORK
设置字典。改为创建副本:相关问题 更多 >
编程相关推荐