2011-01-23 68 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(...)