8

テストモードでdjangoを開始したかどうかに基づいて、条件付きのconnect()を実行できるようにしたいと考えています。

私のsettings.pyでは、mongoengine connect()メソッドを使用してデータベースに接続していますが、manage.pyテストを実行した場合に接続したくないという問題があります。

settings.pyがテストからインポートされているかどうかを確認する方法はありますか?フラグが含まれている可能性があります。

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つの設定ファイルを用意する方が簡単で一般的な方法です。考えられる構成の1つは次のとおりです。

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ため、「test」はコマンドライン引数の1つです。したがって、これは機能します。

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を使用して、接続の動作を変更します(サブモジュールの関数の1つを次のようにモックすることも可能です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 に答える