【问题标题】:Django overriding settings.py OBJECT in unittest not working单元测试中的Django覆盖settings.py OBJECT不起作用
【发布时间】:2019-04-08 07:39:43
【问题描述】:

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

settings.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

覆盖设置

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


【解决方案1】:

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

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

话虽如此,我同意 @Aarif 的观点,因为 DRF 本身已经对这个功能进行了测试。

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

new_config = settings.REST_FRAMEWORK.copy()

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2013-04-25
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2015-05-02
    相关资源
    最近更新 更多