2011-01-23 12 views
8

Quiero ser capaz de hacer condicional connect() en base a cualquiera que empecé a Django en modo de prueba o no.mongoengine connect() en ensayos problema settings.py

en mi settings.py utilizo mongoengine Connect() método para conectar a mi base de datos, pero el problema es que yo no quiero hacer eso si corría prueba manage.py

¿Hay alguna manera de puede verificar si settings.py se está importando de las pruebas o no, quizás alguna bandera.

algo así como si no IN_TESTS: Connect()

Respuesta

14

Estoy resolviendo esto con un corredor de prueba personalizado. Aquí hay un ejemplo en el que basé mi solución: https://github.com/xintron/django-mongorunner/blob/master/mongorunner/testrunner.py

Esto tiene la ventaja de proporcionar una nueva base de datos para cada una de las pruebas de la unidad.

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

Tenga cuidado al desconectar/conectar. Estoy experimentando un comportamiento muy extraño que podría contaminar tus datos. https://github.com/MongoEngine/mongoengine/issues/566 – Rebs

3

Si bien es posible hacer eso, es una práctica más fácil y común tener 2 archivos de configuración. Una posible configuración podría ser:

Tienes 2 archivos de configuración, lsettings.py que no se conecta y settings.py que hace

from lsettings import * 
mongodb.connect() 

Así, mientras que las pruebas a nivel local puede:

python manage.py test --settings=lsettings 

Y no se conecta

tl; dr: Es más fácil de manejar las diferencias de configuración por tener varios archivos de configuración que importan entre sí de forma condicional en lugar de intentar tener parámetros condicionales dentro del mismo archivo de configuración. YMMV.

2

No estoy seguro de que sea completamente infalible, pero uso el hecho de que en una prueba, probablemente lo habrás iniciado desde la línea de comandos con ./manage.py test, entonces 'test' es uno de los argumentos de línea de comandos. Así que esto funciona:

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

he publicado una solución alternativa que proporciona una db mongo fresco para cada unidad de prueba. He usado la técnica que enumeró en otros casos, pero este caso parece estar mejor resuelto en un testrunner. – Gattster

1

Lo que hago es usar register_connection, y luego burlarse de las conexiones de prueba.

En el archivo que defino los documentos Mongo tengo esto:

import mongoengine 
from django.conf import settings 

mongoengine.register_connection(
    'default', settings.MONGOENGINE_DB, **settings.MONGOENGINE_CONNECTION) 

Luego, en las pruebas que utilizo el mock library para cambiar la comportan de conexiones (Sería posible también para burlarse de una de las funciones en el módulo connection sub como get_db) como esto:

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