2014-06-05 20 views
5

Muszę tu pomijać oczywistość. Używam django 1.5.x i tworzę Unittests, na podstawie klasy djangos TestCase. Mam pęczku DB zdefiniowane w ustawieniach, ponieważ jestem ciągnięcie (tylko do odczytu) z wielu różnych źródeł. Podczas uruchamiania testu chcę tylko utworzyć testową wersję domyślnej bazy danych, a resztę chcę oznaczać jako tylko do odczytu, a nie próbować odtwarzać jako nazwa_nazw testowa (zdefiniowany przez użytkownika nie będzie (nie może) mieć uprawnień do ich utworzenia dbs i tak).Django unittest testowe tylko do odczytu bazy danych

Z pewnością jest to możliwe - tak jak mówię, że brakuje mi tego, co oczywiste?

Wdzięczna za każdą pomoc.

Mathew

Odpowiedz

1

Nieoczywisty, nie. Sort-of documented można ustawić nazwę bazy danych do wykorzystania podczas testowania:

settings.py

DATABASES = { 
    'default': { 
    'ENGINE': 'django.contrib.gis.db.backends.spatialite', 
    'NAME': 'db.sqlite3', 
    'TEST_NAME': '/tmp/test.sqlite3', 
    }, 
} 

Jeśli chcesz potem nie zbudować (lub odbudować) bazę testową, musisz odtworzyć bazę danych W nazwach TEST_NAME wpisz: i użyj nowej komendy python manage.py test--keepdb, aby pozostawić nienaruszoną bazę danych, zamiast próbować usunąć ją między kolejnymi uruchomieniami. Od czerwca 2014 r. Musisz przejść na wersję rozwojową Django, aby uzyskać do niej dostęp; ostatecznie to będzie w stabilnym wydaniu. Minusem tego jest, jak rozumiem, to dotyczy wszystkich baz danych, a nie tylko tych, które są tylko do odczytu.

+1

Dzięki, ale myślę, że przekroczyliśmy przewody ?! Moim problemem nie jest to, że chcę kontrolować nazwę wszystkich utworzonych baz testowych, ale nie chcę tworzyć testów w ogóle, z wyjątkiem domyślnych. Więc zamiast obracać pusty duplikat chcę, aby moje testy używały bazy danych wymienionych w ustawieniach dla testów, ponieważ są tylko do odczytu i zapewniają rekordy, które będę potrzebować w testach. – Mathew

+0

@Mathew może być w stanie uzyskać większość drogi, zobacz zmiany – Josh

+2

Problem dla wielu z nas, że cały host jest tylko do odczytu dla niektórych z tych wtórnych dbs. Określenie innej nazwy bazy danych nie pomaga. – shacker

0

miałem ten sam problem i udało się go rozwiązać tak:

settings.py

DATABASES = { 
    'default': {...}, 
    'other': {...} 
} 

DATABASE_ROUTERS = ['routers.MyRouter'] 

... 

TESTING = 'test' in sys.argv 

if TESTING: 
    DATABASE_ROUTERS = [] 
    DATABASES.pop('other')  

Jeśli nie używać zakodowanego db routingu, takie jak z 'using' i używać tylko "DATABASE_ROUTERS", to rozwiązanie powinno być wystarczająco dobre dla Ciebie.

Oczywiście, jeśli chcesz rzeczywiście przetestować połączenie ze zdalnym DB i danymi tam zapisanymi, to nie byłoby sposobu, aby przejść.

+2

Ta technika zapobiega utworzeniu "test_other", ale spowoduje, że testy zakończą się niepowodzeniem dla widoków, które wykorzystują dane żyjące w "innych" (ponieważ faktycznie zniknęły z całej aplikacji). – shacker