我们使用py.test来测试我们的Django系统。 我们在系统中使用非托管DB:
class Example(models.Model):
class Meta:
managed = False
当我们运行需要使用现有数据访问现有数据库的测试时,它们会失败并带有
ConnectionDoesNotExist: The connection my_connection_name doesn't exist
这就是我们的测试结果:
@pytest.mark.django_db
def test_example_access():
from example.models import Example
Example.objects.count()
我们已尝试将以下内容添加到conftest.py中,如Django test tables are not being created的最高回答中所述,但它并未改变此事(尽管已执行)。
@pytest.fixture(autouse=True, scope='session')
def __make_unmanaged_managed():
from django.apps import apps
unmanaged_models = [m for m in apps.get_models() if not m._meta.managed]
for m in unmanaged_models:
m._meta.managed = True
非常感谢你的想法!
ps:Testing django application with several legacy databases为单元测试提供了一种解决方法,但是在具体使用py.test时我不知道如何应用它。
答案 0 :(得分:0)
我在这里遇到了同样的问题,据我所知,这是对我有用的代码片段。
我必须将其放在django项目根目录的conftest.py文件中,以覆盖pytest-django中的常规django_test_environment
固定装置。
@pytest.fixture(autouse=True, scope='session')
def django_test_environment(request):
"""
This is an override of the django_test_environment function in pytest-django,
to run through the unmanaged models, and just for the test, set them to be managed,
so we can create models in our tests, even if we don't manage directly in Django.
"""
from pytest_django.plugin import django_settings_is_configured
from pytest_django.plugin import _setup_django
from django.apps import apps
unmanaged_models = [m for m in apps.get_models() if not m._meta.managed]
for m in unmanaged_models:
m._meta.managed = True
if django_settings_is_configured():
_setup_django()
from django.conf import settings as dj_settings
from django.test.utils import (setup_test_environment,
teardown_test_environment)
dj_settings.DEBUG = False
setup_test_environment()
request.addfinalizer(teardown_test_environment)
Pytest设置django数据库时,使用django_db_setup
固定装置进行设置。该固定装置本身采用django_test_environment
(我们在conftest.py
中进行了覆盖)来更新非托管模型上的managed
状态。
当setup_test_environment
被作为覆盖的setup_test_environment
固定装置的一部分调用时,它将创建必要的表供我们在测试中引用模型
我很想听听这是否可行,因为它似乎最终解决了这个问题,当时我不得不使用许多非托管模型,并用SQL手动创建它们似乎是一个糟糕的主意