2011-01-23 38 views
8

我想能够做条件连接()基于我在测试模式启动django或不。mongoengine连接()在settings.py测试问题

在我的settings.py

我用mongoengine connect()方法连接到我的数据库,但问题是,我不想这样做,如果我跑manage.py测试

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

像 如果不是IN_TESTS: 连接()

回答

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) 
+1

请小心使用断开/连接。我正在经历非常奇怪的行为,可能会导致您的数据受到污染。 https://github.com/MongoEngine/mongoengine/issues/566 – Rebs

3

虽然可以做到这一点,很容易与常见的做法有2个设置文件。一种可能的配置可能是:

你有2个设置文件,lsettings.py未连接和settings.py,做

from lsettings import * 
mongodb.connect() 

所以,当本地测试,您可以:

python manage.py test --settings=lsettings 

它不连接。 dr:通过使多个配置文件有条件地相互导入而不是在同一个设置文件中尝试使用条件参数,可以更容易地管理配置的不同。因人而异。

2

我不确定它是否完全万无一失,但我使用这样一个事实,即在测试中,您可能从命令行开始使用./manage.py test,因此'test'是命令行参数之一。所以这个作品:

import sys 
if 'test' not in sys.argv: 
    mongodb.connect() 
+0

我发布一个替代的解决方案,提供了用于每个单元测试新鲜蒙戈分贝。我已经使用了你在其他案例中列出的技术,但这个案例似乎最好在一个testrunner中解决。 – Gattster

1

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

在该文件中,我定义蒙戈文档我有这样的:

import mongoengine 
from django.conf import settings 

mongoengine.register_connection(
    'default', settings.MONGOENGINE_DB, **settings.MONGOENGINE_CONNECTION) 
在我使用 mock library改变连接的行为与测试

然后(有可能过于嘲笑的功能之一像get_dbconnection子模块)这样上:

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(...)