python - Django 中的多个数据库破坏了测试隔离。如何解决?

标签 python django testing transactions

Django’s TestCase class wraps each test in a transaction and rolls back that transaction after each test, in order to provide test isolation.

然而,显然只有 default 数据库中的操作在事务范围内。我有一个带有路由器的多数据库设置,该路由器将某些模型上的 ORM 调用定向到第二个数据库。这意味着在下面的示例中,test2 失败了:

class MyTestCase(TestCase):

    def test1(self):
        # Let's say Foo model ORM calls are routed to a different DB
        foo = Foo.objects.create(...)
        assert foo.is_ok()

    def test2(self):
        assert not Foo.objects.exists()

解决此问题的最直接方法是覆盖 MyTestCase 中的 tearDown 方法,并手动确保删除所有 Foo 对象。但这有点烦人,因为它有点像 hack 和数据库序列(例如自动增量列)不会被重置,例如,只有在测试套件完成并且数据库被销毁之后。

有没有办法正确解决这个问题,确保默认情况下所有数据库操作都在事务内进行并在每次测试结束时回滚?

[更新]

这是我的路由器:

class FooRouter(object):

    def db_for_read(self, model, **hints):

        if model._meta.app_label == 'foo':
            return 'foo_db'

        return None

    def db_for_write(self, model, **hints):

        if model._meta.app_label == 'foo':
            return 'foo_db'

        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):

        if app_label == 'foo':
            return db == 'foo_db'

        return None

最佳答案

由于 multi_db 已弃用,您现在可以使用新属性 databases 实现对多个数据库的测试

class YourTestCase(TestCase):
   databases = '__all__'

   def test_something(self):
       pass

关于python - Django 中的多个数据库破坏了测试隔离。如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38307523/

相关文章:

python - pip install mysql-python错误

python - 使用 Python 和 PostgreSQL 管理多个类别树

python - 如何模拟 Django 模型对象(及其方法)?

spring-boot - 为什么我的 RestTemple 无法连接到服务器?

java - 使用 SpringRunner 进行单元测试并得到 jdbc 错误

python - (PY)升级pip和安装json包不起作用

python - tensorflow 2中单个矩阵的按位运算

html - 如果背景图片存在则插入 div

Django cached_property 没有被缓存

testing - Gradle:如何在控制台实时显示测试结果?