gpt4 book ai didi

python - Django:覆盖 AppConfig 就绪功能中使用的设置

转载 作者:太空狗 更新时间:2023-10-29 20:30:31 26 4
gpt4 key购买 nike

我们正在尝试为 AppConfig.ready 函数的行为编写一个自动化测试,我们将其用作初始化 Hook 以在 Django 应用加载后运行代码。我们的 ready 方法实现使用了一个 Django 设置,我们需要在测试中覆盖它,我们自然会尝试使用 override_settings 装饰器来实现这一点。

但是有一个障碍 - 当测试运行时,在执行 ready 函数时,设置覆盖还没有启动(它仍然使用 中的原始值设置.py)。有没有一种方法我们仍然可以覆盖设置,以便在调用 ready 函数时应用覆盖?

演示此行为的一些代码:

settings.py

MY_SETTING = 'original value'

dummy_app/__init__.py

default_app_config = 'dummy_app.apps.DummyAppConfig'

dummy_app/apps.py

from django.apps import AppConfig
from django.conf import settings


class DummyAppConfig(AppConfig):
name = 'dummy_app'

def ready(self):
print('settings.MY_SETTING in app config ready function: {0}'.format(settings.MY_SETTING))

dummy_app/tests.py

from django.conf import settings
from django.test import TestCase
from django.test.utils import override_settings


@override_settings(MY_SETTING='overridden value')
@override_settings(INSTALLED_APPS=('dummy_app',))
class AppConfigTests(TestCase):

def test_to_see_where_overridden_settings_value_is_available(self):
print('settings.MY_SETTING in test function: '.format(settings.MY_SETTING))
self.fail('Trigger test output')

输出

======================================================================
FAIL: test_to_see_where_overridden_settings_value_is_available (dummy_app.tests.AppConfigTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/labminds/venv/labos/src/dom-base/dummy_app/tests.py", line 12, in test_to_see_where_overridden_settings_value_is_available
self.fail('Trigger test output')
AssertionError: Trigger test output
-------------------- >> begin captured stdout << ---------------------
settings.MY_SETTING in app config ready function: original value
settings.MY_SETTING in test function: overridden value

--------------------- >> end captured stdout << ----------------------

重要的是要注意,我们只想为断言 ready 行为的测试覆盖此设置,这就是为什么我们不考虑更改 settings 中的设置.py,或使用此文件的单独版本,仅用于运行我们的自动化测试。

已经考虑过一个选项 - 我们可以简单地在我们的测试中初始化 AppConfig 类,调用 ready 并以这种方式测试行为(此时设置将被覆盖由装饰者)。然而,我们更愿意将其作为集成测试运行,并依靠 Django 的自然行为为我们调用函数——这是我们的关键功能,我们希望确保测试在 Django 的初始化行为发生变化时失败。

最佳答案

一些想法(需要不同的努力和自动保证):

  • 不进行集成测试,在升级 Django 版本之前依赖于阅读发布说明/提交和/或依赖于单个手动测试
  • 假设测试 - 阶段部署 - 生产部署管道,对特殊情况进行单元测试隔离并添加集成检查作为部署冒烟测试(例如:通过管理命令或仅内部 url 端点公开此设置值)-仅验证它是否具有分期应有的值(value)。与单元测试相比,反馈略有延迟
  • 通过 Django 自己之外的测试框架对其进行测试 - 即:编写 unittest(或 py.test)并在这些测试中 bootstrap django在每个测试中(尽管您需要一种方法来导入和操作设置)
  • 通过操作系统环境(我们使用了 envdir a'la 12 factor app)结合使用覆盖设置和执行测试的管理命令 - 例如:MY_SETTING='overridden value' INSTALLED_APPS='dummy_app' EXPECTED_OUTCOME='whatever' python manage.py ensure_app_config_initialized_as_expected
  • 正在查看 Django's own app init tests apps.clear_cache()
    使用 override_settings(INSTALLED_APPS=['test_app']):
    config = apps.get_app_config('test_app')
    断言配置....
    可以工作,尽管我从未尝试过

关于python - Django:覆盖 AppConfig 就绪功能中使用的设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com