Ami*_*irM 5 django django-testing django-tests
我有5个遗留数据库的django应用程序.几乎所有模型都使用meta属性设置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'
Run Code Online (Sandbox Code Playgroud)
并运行python manage.py test --settings=web_services.settings.test.但是,它没有帮助,因为无论如何 - 现有的迁移已经创建了managed=False选项.只有在我在模型中注释掉managed=False,删除旧的迁移,创建新的迁移(没有managed=False选项)之后,测试似乎才有效.
有了这个,我很遗憾 - 在我的案例(多个遗留数据库)中编写测试实际上是一个好习惯吗?处理调整迁移的麻烦似乎是错误的.
这就是我现在解决问题的方法.
使用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,
},
),
Run Code Online (Sandbox Code Playgroud)
需要注释'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,
},
),
Run Code Online (Sandbox Code Playgroud)
然后我们需要在测试运行期间参考这些迁移.为此,我创建了设置文件test.py并将必要的引用放在那里.像这样:
from web_services.settings.dev import *
MIGRATION_MODULES = {
'myapp': 'web_services.apps.myapp.test_migrations',
}
Run Code Online (Sandbox Code Playgroud)
运行测试时,您需要参考以下设置:
python manage.py test --settings=web_services.settings.test
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |