2011-01-23 11 views
8

Chcę móc wykonać warunkowe connect() na podstawie albo uruchomiłem django w trybie testowym, albo nie.mongoengine connect() w problemie testowania settings.py

w moim settings.py używam mongoengine connect() metodę, aby połączyć się z bazą danych, ale problemem jest to, że nie chcę tego robić, gdybym prowadził manage.py testu

Czy jest jakiś sposób ja może sprawdzić, czy plik settings.py jest importowany z testów, czy nie, może jakaś flaga.

coś jeśli nie IN_TESTS: connect()

Odpowiedz

14

Rozwiązuję to z niestandardowym biegiem testowym. Oto przykład, na którym oparłem swoje rozwiązanie na: https://github.com/xintron/django-mongorunner/blob/master/mongorunner/testrunner.py

Ma to tę zaletę, że dla każdej z twoich testów jednostkowych dostarczana jest świeża baza danych 10.

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

Zachowaj ostrożność, korzystając z rozłączania/łączenia. Mam dziwne zachowanie, które może spowodować zanieczyszczenie twoich danych. https://github.com/MongoEngine/mongoengine/issues/566 – Rebs

3

Choć możliwe jest, aby to zrobić, łatwiej jest powszechną praktyką i mieć 2 Ustawienia plików. Jedna z możliwych konfiguracji mogą być:

Masz 2 Ustawienia plików lsettings.py że nie łączy i settings.py że robi

from lsettings import * 
mongodb.connect() 

Tak więc, choć lokalnie testowania Możesz:

python manage.py test --settings=lsettings 

i to nie łączy się.

tl; dr: Łatwiej jest zarządzać różnicami w konfiguracji dzięki wielu plikom konfiguracyjnym, które importują się nawzajem warunkowo, zamiast próbować mieć parametry warunkowe w obrębie tego samego pliku ustawień. YMMV.

2

Nie jestem pewien, czy jest całkowicie niezawodny, ale korzystam z tego, że w teście prawdopodobnie uruchomiłeś go z linii poleceń z ./manage.py test, więc "test" jest jednym z argumentów wiersza poleceń. To działa:

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

że wysłane alternatywne rozwiązanie zapewnia świeży Mongo dB dla każdego z testów urządzenia. Użyłem techniki, którą wymieniłeś w innych przypadkach, ale ta sprawa wydaje się najlepiej rozwiązana w testrunneru. – Gattster

1

Co mogę zrobić, to użyć register_connection, a potem kpić połączenia na teście.

W pliku, że określenie Mongo Dokumenty mam to:

import mongoengine 
from django.conf import settings 

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

Następnie w testach używam mock library zmienić zachowywać połączeń (możliwe byłoby zbyt mock jednej z funkcji modułu connection sub jak get_db) jak poniżej:

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(...) 
Powiązane problemy