TEST Mirror默认数据库,但无数据

djp*_*jpy 4 django

我正在尝试在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'


    }
Run Code Online (Sandbox Code Playgroud)

我的测试:

data_school = DataSchool.objects.all()
self.assertTrue(data_school.exists())
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*lin 5

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

该票证中描述的解决方法是您最好的选择。我遇到了同样的问题,并通过定义自定义TestCase类并在所有测试中从该自定义测试用例继承来实现了变通方法。我还选择使用setUpClass和tearDownClass代替错误票证中所述的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()
Run Code Online (Sandbox Code Playgroud)