有一个使用 Django Rest Framework 的 Django 应用程序。设置文件包含一个具有设置的对象:
settings.py
REST_FRAMEWORK = {
...
'DEFAULT_THROTTLE_RATES': {
'burst': '30/second',
},
...
}
单元测试应该测试节流的实际效果。然而,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
覆盖设置
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 Framework 中的一个错误/缺失的功能。设置测试工具(SimpleTestCase.settings
、override_settings
、modify_settings
)发出 setting_changed
信号并依赖于每个组件进行相应更新。
Django REST Framework确实监听此信号( source ),但这对节流速率没有影响,因为节流速率是一个类属性( source )。
话虽这么说,我同意@Aarif 的观点,即这不需要测试,因为 DRF 本身就有涵盖此功能的测试。
另请注意,您正在修改现有的 REST_FRAMEWORK
设置字典。相反,创建一个副本:
new_config = settings.REST_FRAMEWORK.copy()
关于python - Django 覆盖单元测试中的 settings.py OBJECT 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55568399/