【问题标题】:TEST Mirror default database but no dataTEST 镜像默认数据库但没有数据
【发布时间】:2015-11-26 14:30:55
【问题描述】:

我正在尝试对我的 Django 应用程序进行一些测试。我为测试数据库使用了数据库镜像。当我尝试运行少量测试时,镜像测试数据库中似乎没有来自“默认数据库”的数据。

'default': { #'sqlite': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'OPTIONS':{
            'timeout': 180,
        },
        #  'TEST':{
        #     'MIRROR': 'default',
        #
        # }


    },
'replica': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'OPTIONS':{
            'timeout': 180,
        },
        'TEST_MIRROR': 'default'


    }

我的测试:

data_school = DataSchool.objects.all()
self.assertTrue(data_school.exists())

我很困惑,数据库管理员配置的test_mirrors作为默认数据库的只读副本。理论上默认数据库中的任何数据都应该可用于测试?如果我有任何配置错误,请告知。谢谢

【问题讨论】:

  • +1 有同样的问题 - 尽管设置了 'TEST_MIRROR' 或 'TEST',但在 'replica' DB 中找不到在 'default' DB 中创建的记录:{'MIRROR': 'default'}正在为“副本”数据库设置进行设置
  • FWIW 这似乎是 Django 中的一个错误:code.djangoproject.com/ticket/23718

标签: django


【解决方案1】:

这是 Django 中的一个已知错误: https://code.djangoproject.com/ticket/23718

该票中描述的解决方法是您最好的选择。我遇到了同样的问题并通过定义一个自定义 TestCase 类并在我的所有测试中从该自定义测试用例继承来实现解决方法。我还选择使用 setUpClass 和 tearDownClass 而不是 bug 票中描述的 setUp 和 tearDown。两者都应该工作。

from django.db import connections

class CustomTestCase(TestCase):

    @classmethod
    def setUpClass(cls):
        super(CustomTestCase, cls).setUpClass()
        connections['replica']._orig_cursor = connections['replica'].cursor
        connections['replica'].cursor = connections['default'].cursor

    @classmethod
    def tearDownClass(cls):
        connections['replica'].cursor = connections['replica']._orig_cursor
        super(CustomTestCase, cls).tearDownClass()

【讨论】:

  • 我认为这个解决方案不再适用于 django 2.2
  • 它与 Django 3.0.x 和 pytest 一起使用,使用 module level setup/teardown
猜你喜欢
  • 2015-08-07
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2017-03-22
  • 2019-02-04
相关资源
最近更新 更多