【问题标题】:How to test/simulate broken database connection如何测试/模拟断开的数据库连接
【发布时间】:2020-06-12 13:15:43
【问题描述】:

当我的应用程序无法连接到数据库时,我已经编写了返回自定义错误的逻辑(为什么会发生这种情况超出了这个问题的范围)。我希望为此编写单元测试,特别是在以下情况下查看响应状态代码:

  1. 存在到数据库的有效连接。这很容易,因为每当我运行任何测试时,Django 都会自动创建一个“测试”数据库。
  2. 没有到数据库的有效连接。不幸的是,我找不到任何关于此的文档。

是否可以通过某种方式模拟数据库连接出现问题来运行该测试?

【问题讨论】:

  • 你想模拟的究竟是什么,在没有数据库连接的情况下也能工作
  • @iklinac 自定义服务器错误
  • 请详细说明问题,但想知道为什么不直接在测试中提出错误
  • 我无法引发错误,因为我编写的逻辑驻留在中间件中。我创建了一个 cursor() 来检查连接是否存在。我怀疑提出错误会起作用。

标签: django django-testing


【解决方案1】:

您可以简单地在测试期间提出自定义错误,而不是模拟失败的连接。

raise customConnectionError('oops')

另一种可能性是使用django.db.connection.creation 中的destroy_test_db 方法来关闭与数据库的连接。

from django.db.connection.creation import destroy_test_db


destroy_test_db('your_database_name', keepdb=True)

更多信息请咨询Django Docs: destroy_test_db

【讨论】:

  • 当我通过在 connection 对象上创建光标来测试连接性时,我无法引发 customConnectionError。至于连接到一个不存在的测试数据库,你的意思是使用settings.py吗?我可能会犹豫是否这样做,因为这只是一个单元测试,它似乎太多开销。
  • 上次测试时运行它怎么样?您可以在完成其他所有操作后销毁测试数据库,然后尝试连接。也许试试destory_test_db
  • 感谢@0p3r4t0r,这是一个有趣的想法!
  • 让我知道结果如何。如果可行,我将编辑我的答案。
  • 您指出的内容确实非常接近:“如果 keepdb 参数为 True,则与数据库的连接将关闭,但不会破坏数据库。”。似乎这确实是我想要的,除了我的测试在我使用它时到处抛出错误。但是,如果您使用此信息更新您的答案,我会将其标记为已接受:)
【解决方案2】:

实现此目的的另一种方法是使用mocks。你可以让你的中间件接受一个默认为 None 的 conn 对象,然后向它传递一个带有 side_effect 被破坏的模拟连接对象。

我写了一篇关于如何做到这一点的文章here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2016-06-12
    • 2012-05-18
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多