Django覆盖设置.pyunittest中的对象不工作

2024-06-09 09:06:54 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个Django应用程序使用Django Rest框架。设置文件包含具有以下设置的对象:

设置.py

REST_FRAMEWORK = {
    ...
    'DEFAULT_THROTTLE_RATES': {
        'burst': '30/second',
    },
    ...
}

unittest应该测试节流的实际工作情况。然而,Django测试模块(SimpleTestCase.settingsoverride_settingsmodify_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

覆盖\u设置

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.

所以它实际上应该起作用。你知道吗

有线索怎么处理吗?你知道吗


Tags: 对象djangoselfrestconfigdefaultnewsettings
1条回答
网友
1楼 · 发布于 2024-06-09 09:06:54

我认为这实际上是Django REST框架中的一个bug/缺失特性。设置测试工具(SimpleTestCase.settingsoverride_settingsmodify_settings)发出一个setting_changed信号,并依赖每个组件进行相应的更新。你知道吗

Django REST框架确实侦听这个信号(source),但是这对节流速率没有影响,因为节流速率是一个类属性(source)。你知道吗

也就是说,我同意@Aarif的说法,因为DRF本身有覆盖这个特性的测试。你知道吗

另外,请注意,您正在修改现有的REST_FRAMEWORK设置字典。改为创建副本:

new_config = settings.REST_FRAMEWORK.copy()

相关问题 更多 >