7

我有 5 个遗留数据库的 django 应用程序。几乎所有模型都设置了元属性managed=False。自从managed=False设置后,每个模型的迁移都使用选项创建managed=False。而且由于 django 测试运行程序为每个模型选择现有迁移以在 test_databases 中创建测试表,因此它根本不会创建任何东西。我尝试test.py使用以下解决方法创建设置文件:

from web_services.settings.dev import *
from django.test.runner import DiscoverRunner


class UnManagedModelTestRunner(DiscoverRunner):

    def setup_test_environment(self, *args, **kwargs):
        from django.apps import apps
        self.unmanaged_models = [m for m in apps.get_models() if not m._meta.managed]
        for m in self.unmanaged_models:
            m._meta.managed = True
        super(UnManagedModelTestRunner, self).setup_test_environment(*args, **kwargs)

    def teardown_test_environment(self, *args, **kwargs):
        super(UnManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
        # reset unmanaged models
        for m in self.unmanaged_models:
            m._meta.managed = False

TEST_RUNNER = 'web_services.settings.test.UnManagedModelTestRunner'

和运行python manage.py test --settings=web_services.settings.test。但是,它没有帮助,因为无论如何 - 已经使用managed=False选项创建了现有迁移。只有在我在我的模型中注释掉managed=False、删除旧的迁移、创建新的迁移(没有managed=False选项)之后,测试似乎才起作用。

有了这个,我很迷茫 - 在我的案例(多个遗留数据库)中编写测试实际上是一个好习惯吗?处理调整迁移的麻烦似乎是错误的。

4

1 回答 1

9

这是我现在解决问题的方法。

使用选项创建的迁移managed=False如下所示:

# migrations/0001_initial.py
migrations.CreateModel(
            name='MyModel',
            fields=[
                ('field_id', models.IntegerField(primary_key=True, serialize=False)),
                ('slug', models.CharField(max_length=20, unique=True)),
                ('name', models.CharField(max_length=64)),
            ],
            options={
                'db_table': 'MyModel',
                'managed': False,
            },
        ),

需要注释掉'managed': False以允许应用迁移。为了不弄乱实际的迁移,我创建了文件夹test_migrations并将我的迁移复制到那里并'managed': False注释掉:

# test_migrations/0001_initial.py
migrations.CreateModel(
            name='MyModel',
            fields=[
                ('field_id', models.IntegerField(primary_key=True, serialize=False)),
                ('slug', models.CharField(max_length=20, unique=True)),
                ('name', models.CharField(max_length=64)),
            ],
            options={
                'db_table': 'MyModel',
                # 'managed': False,
            },
        ),

然后我们需要在测试运行期间参考这些迁移。为此,我创建了设置文件test.py并在其中放置了必要的参考。像这样:

from web_services.settings.dev import *


MIGRATION_MODULES = {
    'myapp': 'web_services.apps.myapp.test_migrations',
}

在运行测试时,您需要参考该设置:

python manage.py test --settings=web_services.settings.test

于 2016-05-05T20:56:39.860 回答