Django 1.11 + py.test:当测试函数需要访问非托管外部表/ DB时修复ConnectionDoesNotExist

时间:2018-01-22 13:16:14

标签: django pytest

我们使用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时我不知道如何应用它。

1 个答案:

答案 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手动创建它们似乎是一个糟糕的主意