TEST镜像默认数据库但没有数据

时间:2015-11-26 14:30:55

标签: 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'


    }

我的测试:

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

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

1 个答案:

答案 0 :(得分:4)

这是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()