你的表是不受管理(managed = False
),所以它不会迁移过程中自动创建或测试。
- 如果您的表应该得到迁移过程中创建的,只是删除
managed = False
线
- 如果你的表是不是应该得到迁移过程中创建的视图或传统的表,你需要做的模型在测试期间管理。
如果2,和你用简单manage.py test
,我已经找到了最好的解决办法是增加一个测试运行修改该管理标志上的任何非托管模式。我的是这样一个runners.py文件:
# Credit:
# http://birdhouse.org/blog/2015/03/25/django-unit-tests-against-unmanaged-databases/
# https://www.caktusgroup.com/blog/2010/09/24/simplifying-the-testing-of-unmanaged-database-models-in-django/
from smapi.settings import *
from django.test.runner import DiscoverRunner
class ManagedModelTestRunner(DiscoverRunner):
"""
Test runner that automatically makes all unmanaged models in your Django
project managed for the duration of the test run, so that one doesn't need
to execute the SQL manually to create them.
"""
def __init__(self, **kwargs):
from django.apps import apps
super(ManagedModelTestRunner, self).__init__(**kwargs)
# for a in apps.get_apps():
# print("Found app %s" % (a))
# NOTE: apps must be registered in INSTALLED_APPS in settings.py before their models appear here
all_models = apps.get_models()
# for m in all_models:
# print("Found model %s - Managed:%s" % (m, m._meta.managed))
self.unmanaged_models = [m for m in all_models if not m._meta.managed]
def setup_test_environment(self, *args, **kwargs):
for m in self.unmanaged_models:
m._meta.managed = True
# print("Modifying model %s to be managed for testing - Managed:%s" % (m, m._meta.managed))
super(ManagedModelTestRunner, self).setup_test_environment(*args, **kwargs)
def teardown_test_environment(self, *args, **kwargs):
super(ManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
# reset unmanaged models
for m in self.unmanaged_models:
m._meta.managed = False
# print("Resetting model %s to be unmanaged - Managed:%s" % (m, m._meta.managed))
它被加入这行来的settings.py激活:
# Set Django's test runner to the custom class defined in runners.py
TEST_RUNNER = '<project name>.runners.ManagedModelTestRunner'
终于在今天,我在这里是因为我们开始使用pytest为测试和上述解决方案停止工作。一堆搜索后,我发现在评论修复以上(source, credit to Jan Murre)样品中存入页面
感谢的伎俩之一。因为我正在使用pytest-django,所以我必须找到 了解如何以我的方式执行此操作。
pytest-django使用灯具。已经有一个工具可以执行setup_test_environment()调用。
所以,我们需要一个夹具,在此之前,设置 '_meta.managed'。似乎自动灯具以 字母顺序执行,所以在pytest-django灯具(即 的名称以'_django'开头)之前,我们灯具的名称以'__'开始 。
@pytest.fixture(autouse=True, scope='session')
def __make_unmanaged_managed():
from django.db.models.loading import get_models
unmanaged_models = [m for m in get_models() if not m._meta.managed]
for m in unmanaged_models:
m._meta.managed = True
我们把上面的代码中conftest.py和我们的测试又开始工作。
谢谢,但它不适用于我 –