python - Django 覆盖单元测试中的 settings.py OBJECT 不起作用

标签 python django django-rest-framework django-unittest

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

settings.py

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

单元测试应该测试节流的实际效果。然而,Django Test 模块提供的工具( 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

这两种方法对于原始变量和列表都可以正常工作,但对于对象则失败。

文档指出:

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.settingsoverride_settingsmodify_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/

相关文章:

python - 识别文档中的图像并自动将其删除的算法

python - 将 python 'type' 对象转换为字符串

python - 在Python中显示一列中n个元素的排列的方法

python - 如何在 HttpResponse 中编写 Django 模板标签 {% %}

facebook - Django-rest-auth Facebook 注册

Django rest 框架嵌套的 View 集和路由

python - 配置 pip 以从 pypi.python.org 获取丢失的包

python - Django 外键访问是如何工作的

python - 如何从 Django/postgreSQL 中的数据库中随机获取一个项目?

python - Django Rest Framework ModelSerializer 在创建时设置属性