mongoengine connect() in settings.py testing problem
我希望能够基于是否以测试模式启动django来进行条件connect()。
在我的settings.py中,我使用mongoengine connect()方法连接到数据库,但问题是,如果我运行manage.py test,我不想这样做。
有什么方法可以检查是否从测试中导入了settings.py,也许是一些标记。
就像是
如果不是IN_TESTS:
connect()
我正在通过自定义测试运行程序解决此问题。这是我基于以下解决方案的示例:https://github.com/xintron/django-mongorunner/blob/master/mongorunner/testrunner.py
这具有为每个单元测试提供新数据库的优点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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) |
尽管可以这样做,但是拥有2个设置文件是更容易且常见的做法。一种可能的配置可能是:
您有2个设置文件,
1 2 | from lsettings import * mongodb.connect() |
因此,在进行本地测试时,您可以:
1 | python manage.py test --settings=lsettings |
而且它没有连接。
tl; dr:通过使多个配置文件有条件地相互导入,而不是试图在同一设置文件中包含条件参数,可以更轻松地管理配置差异。 YMMV。
我不确定它是否完全安全,但是我使用了这样的事实:在测试中,您可能已经使用
1 2 3 | import sys if 'test' not in sys.argv: mongodb.connect() |
我要做的是使用
在我定义Mongo文档的文件中,我具有以下内容:
1 2 3 4 5 | import mongoengine from django.conf import settings mongoengine.register_connection( 'default', settings.MONGOENGINE_DB, **settings.MONGOENGINE_CONNECTION) |
然后在测试中,我使用模拟库来更改连接的行为(也可以模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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(...) |