我试图为我的django项目编写测试用例,但是当我跑步时 " $ ./manage.py test"命令 它创建测试数据库,但它没有创建任何表,我收到表不存在的错误。欢迎任何建议。这是我通过" ./ manage.py inspectdb>创建的模型。 models.py"
class MyCustomModel(models.Model):
name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
class Meta:
managed = False
db_table = 'MY_TABLE'
答案 0 :(得分:5)
您的表格不受管理(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中,我们的测试又开始了。
答案 1 :(得分:3)
将--nomigrations添加到您的pytest.ini
[pytest]
addopts = --nomigrations
并将其添加到您的顶级conftest.py
@pytest.fixture(autouser=True, scope="session")
def django_test_environment(django_test_environment):
from django.apps import apps
get_models = apps.get_models
for m in [m for m in get_models() if not m._meta.managed]:
m._meta.managed = True
它会做魔术
答案 2 :(得分:0)
你有迁移吗?运行python manage.py makemigrations
,在测试运行期间构建的数据库使用它们。
答案 3 :(得分:0)
您需要使用:
./manage.py syncdb
这取代
./django-admin migrate
来自django 1.7