gpt4 book ai didi

django - 如何覆盖 Django 测试中的数据库设置?

转载 作者:行者123 更新时间:2023-12-01 15:49:42 24 4
gpt4 key购买 nike

我在 Django 1.8(使用 pytest)上,我有以下配置:

  • defaultreadonly 数据库由 MasterSlaveRouter 管理,根据它们是读取或写入操作。
  • 在我的开发环境中,settings.DATABASES 字典中的两个条目具有相同的设置(它们只是使用不同的连接,但数据库是相同的)。
  • 但是,在我的测试环境中,只有一个默认 数据库。
  • 每当保存模型 Foo 时,我都会触发一个 post_save 信号。
  • 我有一个原子操作(用 @transaction.atomic 修饰)修改一个 Foo 实例并在其上调用 .save()两次。由于没有自定义 using 参数传递给装饰器,因此事务仅在 default 数据库上处于事件状态。

post_save 回调创建一个 Bar 记录,其中 OneToOneField 指向 Foo,但仅在检查是否具有此 foo_idBar 记录已经存在(为了避免 IntegrityError)。此检查是通过执行此查询完成的:

already_exists = Bar.filter(foo=instance).exists()

第一次调用 post_save 回调是可以的。 Bar 记录已创建,一切正常。然而,第二次,即使这样的 Bar 实例只是在之前的 Foo 保存中创建的,因为过滤是一个读取操作,它是使用 readonly 连接,因此 already_exists 最终包含值 False 并触发新记录的创建,最终抛出 IntegrityError 因为当创建操作时在 default 连接上执行,已经有包含该 foo_id 的记录。

我尝试将 DATABASES 字典从 dev_settings 复制到 test_settings,但这破坏了许多测试。然后我阅读了有关 override_settings 装饰器的信息,并认为它非常适合我的情况。然而,令我惊讶的是,它没有用。似乎在某个时候,当应用程序启动时,DATABASES 字典(只有来自 test_settings 的 default 字典)被缓存,然后即使我更改了 setting.DATABASES,新值不再被访问。

我如何才能正确覆盖某个特定测试的数据库配置?

最佳答案

嗯...好吧,如果你只使用 pytest,我认为你需要在测试后清理你的数据库。

现在,要覆盖 django 设置,最好:

from django.test import override_settings
@override_settings(DATABASE_CONFIG=<new_config>)
def test_foo():
pass

你应该试试 pytest-django:

pytestmark = pytest.mark.django_db

@pytest.mark.django_db
def test_foo():
pass

当你运行你的测试时,你可以设置 create-db 参数,强制 py.test 创建一个新的数据库,或者如果你想重用你的数据库,你可以设置 reuse-db,比如:

$ py.test --create-db
$ py.test --reuse-db

结帐: Oficial docs

关于django - 如何覆盖 Django 测试中的数据库设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36403168/

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