我的Django应用程序有5个遗留数据库,几乎所有的模型都设置了 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'
但是,它没有帮助,因为无论如何-现有的迁移已经创建了managed=False
选项。测试似乎只有在我的模型managed=False
注解,删除旧的迁移,创建新的(没有managed=False
选项)。
对于这一点,我感到非常困惑--在我的情况下(多个遗留数据库),编写测试的实际好实践是什么?处理调整迁移的麻烦似乎是错误的。
2条答案
按热度按时间zzlelutf1#
以下是我目前解决问题的方法。
使用
managed=False
选项创建的迁移如下所示:需要注解掉
'managed': False
才能应用迁移。为了不干扰实际的迁移,我创建了文件夹test_migrations
,并将我的迁移复制到其中,其中'managed': False
被注解掉:然后我们需要在测试运行期间引用这些迁移。为此,我创建了设置文件
test.py
,并在其中放置了必要的引用。如下所示:在运行测试时,您需要参考这些设置:
python manage.py test --settings=web_services.settings.test
xriantvc2#
在研究和阅读了许多关于如何测试遗留只读数据库的文档后,如果你只想在同一个遗留数据库中执行测试而不创建一个副本,最好的和简单的解决方案是在数据库的TEST配置中将同一个遗留数据库设置为MIRROR。