【问题标题】:mongoengine connect() in settings.py testing problemsettings.py 中的mongoengine connect() 测试问题
【发布时间】:2011-01-23 16:11:01
【问题描述】:

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

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

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

类似的东西 如果不是 IN_TESTS: 连接()

【问题讨论】:

    标签: django unit-testing mongoengine


    【解决方案1】:

    我正在使用自定义测试运行程序来解决这个问题。这是我的解决方案基于以下示例: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)
    

    【讨论】:

    【解决方案2】:

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

    您有 2 个设置文件,lsettings.py 未连接,settings.py 已连接

    from lsettings import *
    mongodb.connect()
    

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

    python manage.py test --settings=lsettings
    

    它没有连接。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我发布了一个替代解决方案,它为每个单元测试提供了一个新的 mongo db。我在其他情况下使用了您列出的技术,但这种情况似乎最好在测试运行程序中解决。
      【解决方案4】:

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

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

      import mongoengine
      from django.conf import settings
      
      mongoengine.register_connection(
          'default', settings.MONGOENGINE_DB, **settings.MONGOENGINE_CONNECTION)
      

      然后在测试中,我使用mock library 来更改连接的行为(也可以模拟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(...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2015-10-19
        相关资源
        最近更新 更多