Django测试镜像数据库没有接收数据

Gre*_*nch 6 python testing django unit-testing

我正在尝试在我的Django应用程序上设置一些测试.我在整个应用程序中使用数据库镜像进行一些读取.当我尝试测试这些部分时,通过在数据库中创建模拟数据然后尝试读取它,看起来好像数据不在镜像数据库中,尽管被配置为a TEST_MIRROR.

用于测试的数据库配置如下所示:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'maindb',
    'HOST': 'localhost'
  },
  'mirror1': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'maindb',
    'HOST': 'localhost',
    'TEST_MIRROR': 'default'
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的测试中我做了这样的事情(Foo是一个模型)

Foo.objects.create(name='bar')
self.assertTrue(Foo.objects.filter(name='bar').exists()) # passes
self.assertTrue(Foo.objects.using('mirror1').filter(name='bar').exists()) # fails
Run Code Online (Sandbox Code Playgroud)

这对我来说很困惑,因为我认为TEST_MIRROR对镜像的调用是直接通过默认值?

hyn*_*cer 5

如果您的设置包含多个数据库,并且您有一个需要每个数据库的测试,则可以使用测试套件上的multi_db属性来请求完全刷新。

例如:

class TestMyViews(TestCase):
    multi_db = True        # for Django < 3.1 (deprecated since 2.2)
    databases = '__all__'  # for Django >= 2.2
    # databases = {'default', 'other'}  # or explicit databases


    def testIndexPageView(self):
        call_some_test_code()
Run Code Online (Sandbox Code Playgroud)

该文档(多数据库支持测试)并不准确,因为条件 multi_db (间接在 _databases_names 中)不仅用于 Django 源中的刷新(tearDown),还用于“_fixture_setup”。(Django-1.5.1/django/test/testcases.py:834)因此它似乎是独立于主/从设置的基本条件。

  • 恐怕我不认为这就是这个问题的答案。我们在生产中有类似主/从关系的东西(在 Heroku 上有一个“follower”数据库),但是在进行本地开发时,我们只需将两者的数据库配置指向单个数据库。当测试构建环境时,它会为每个现有数据库创建一个“_test”副本,但由于它在配置中看到两个副本,因此它会尝试创建相同的副本两次。这就是“TEST_MIRROR”修复的问题,因为它知道不为镜像创建数据库,但它似乎没有通知 ORM 将查询从镜像数据库传递到主数据库。 (2认同)