Rav*_*rma 2 python django django-testing python-unittest pytest-django
我正在尝试为我的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'
Run Code Online (Sandbox Code Playgroud)
小智 8
将--nomigrations添加到您的pytest.ini或setup.cfg- 无论您的 pytest 设置所在的位置:
[pytest]
addopts = --nomigrations
Run Code Online (Sandbox Code Playgroud)
并将其添加到您的顶级 conftest.py
[pytest]
addopts = --nomigrations
Run Code Online (Sandbox Code Playgroud)
它会变魔术
您的表是非托管的(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))
Run Code Online (Sandbox Code Playgroud)
通过将此行添加到settings.py来激活它:
# Set Django's test runner to the custom class defined in runners.py
TEST_RUNNER = '<project name>.runners.ManagedModelTestRunner'
Run Code Online (Sandbox Code Playgroud)
最后,我今天在这里,因为我们开始使用pytest进行测试,上面的解决方案停止了工作.经过一堆搜索后,我在上面的示例中对其中一个页面的评论中发现了一个修复(来源,归功于Jan Murre)
谢谢你的伎俩.因为我正在使用pytest-django,我必须找到如何以我的方式做到这一点.
pytest-django使用固定装置.已有一个fixture执行setup_test_environment()调用.
因此,我们需要一个前面的夹具来设置'_meta.managed'.似乎自动夹具按字母顺序执行,因此要在pytest-django夹具(名称以'_django'开头)之前,我们夹具的名称以'__'开头.
Run Code Online (Sandbox Code Playgroud)@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中,我们的测试再次开始工作.
| 归档时间: |
|
| 查看次数: |
2573 次 |
| 最近记录: |