8

我希望能够根据我是否在测试模式下启动 django 来执行条件 connect()。

在我的 settings.py 中,我使用 mongoengine connect() 方法连接到我的数据库,但问题是如果我运行 manage.py test 我不想这样做

有什么方法可以检查 settings.py 是否从测试中导入,可能是一些标志。

类似 if not IN_TESTS: connect()

4

4 回答 4

14

我正在使用自定义测试运行器解决这个问题。这是我基于以下解决方案的示例: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)
于 2012-04-16T23:55:47.377 回答
3

虽然可以这样做,但拥有 2 个设置文件更容易且更常见。一种可能的配置可能是:

您有 2 个设置文件,lsettings.py 没有连接settings.py,但确实

from lsettings import *
mongodb.connect()

因此,在本地测试时,您可以:

python manage.py test --settings=lsettings

它没有连接。

tl;dr:通过有多个配置文件有条件地相互导入而不是尝试在同一个设置文件中包含条件参数,更容易管理配置差异。YMMV。

于 2011-01-23T16:20:49.980 回答
2

我不确定它是否完全万无一失,但我使用的事实是,在测试中,您可能会从命令行使用 启动它./manage.py test,因此“测试”是命令行参数之一。所以这有效:

import sys
if 'test' not in sys.argv:
    mongodb.connect()
于 2011-01-23T16:53:28.370 回答
1

我所做的是使用register_connection,然后在测试中模拟连接。

在我定义 Mongo 文档的文件中,我有这个:

import mongoengine
from django.conf import settings

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

然后在测试中,我使用模拟库来改变连接的行为(也可以模拟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(...)
于 2012-05-06T19:21:05.683 回答