mongoengine connect () в задаче тестирования settings.py - PullRequest
8 голосов
/ 23 января 2011

Я хочу иметь возможность выполнять условное connect (), основываясь на том, что я запустил django в режиме тестирования или нет.

в моих settings.py Я использую метод mongoengine connect () для подключения к моей базе данных, нопроблема в том, что я не хочу этого делать, если я запустил manage.py test

Можно ли как-нибудь проверить, импортируется ли settings.py из тестов или нет, может быть, какой-нибудь флаг.

что-то вроде, если не IN_TESTS: connect ()

Ответы [ 4 ]

14 голосов
/ 17 апреля 2012

Я решаю это с помощью пользовательского теста.Вот пример, на котором я основал свое решение: https://github.com/xintron/django-mongorunner/blob/master/mongorunner/testrunner.py

Преимущество этого заключается в предоставлении новой базы данных для каждого из ваших модульных тестов.

class MyTestRunner(DjangoTestSuiteRunner):

    mongodb_name = 'testsuite'

    def setup_databases(self, **kwargs):
        from mongoengine.connection import connect, disconnect
        disconnect()
        connect(self.mongodb_name)
        print 'Creating mongo test-database ' + self.mongodb_name
        return super(MyTestRunner, self).setup_databases(**kwargs)

    def teardown_databases(self, old_config, **kwargs):
        from mongoengine.connection import get_connection, disconnect
        connection = get_connection()
        connection.drop_database(self.mongodb_name)
        print 'Dropping mongo test-database: ' + self.mongodb_name
        disconnect()
        super(MyTestRunner, self).teardown_databases(old_config, **kwargs)
3 голосов
/ 23 января 2011

Хотя это возможно, но проще и проще иметь 2 файла настроек. Одна из возможных конфигураций может быть:

У вас есть 2 файла настроек, lsettings.py, который не подключается, и settings.py, который делает

from lsettings import *
mongodb.connect()

Итак, при локальном тестировании вы можете:

python manage.py test --settings=lsettings

И это не соединяется.

tl; dr: Управлять различиями конфигурации проще, если иметь несколько файлов конфигурации, которые импортируют друг друга условно, а не пытаться иметь условные параметры в одном файле настроек. YMMV.

2 голосов
/ 23 января 2011

Я не уверен, что это полностью надежно, но я использую тот факт, что в тесте вы, вероятно, запустили его из командной строки с ./manage.py test, так что 'test' - это один из аргументов командной строки. Так что это работает:

import sys
if 'test' not in sys.argv:
    mongodb.connect()
1 голос
/ 06 мая 2012

Я использую register_connection, а затем проверяю соединения при тестировании.

В файле, который я определяю Mongo Documents, у меня есть это:

import mongoengine
from django.conf import settings

mongoengine.register_connection(
    'default', settings.MONGOENGINE_DB, **settings.MONGOENGINE_CONNECTION)

Затем в тестах я использую библиотеку mock , чтобы изменить поведение соединений (также можно смоделировать одну из функций в субмодуле connection, например get_db), как это :

connections = patch.dict(
    mongoengine.connection._connections, {'default': None})

dbs = patch.dict(
    mongoengine.connection._dbs, {'default': {
        'your_collection': None,
        'another_collection': None,
        }})

dbs.start()
connections.start()

insert = patch.object(mongoengine.queryset.QuerySet, 'insert')
insert_mock = insert.start()

...

insert_mock.assert_called_once(...)
...