2014-06-05 29 views
5

Mi manca l'ovvio qui. Sto usando django 1.5.x e sto creando le unittests, basate sulla classe djangos TestCase. Ho un sacco di DB definiti nelle impostazioni come sto tirando (sola lettura) da un sacco di diversa fonte. Quando eseguo il test voglio solo creare una versione di prova del mio db di default il resto voglio flag come di sola lettura e non provare a ricreare come test_db_name (l'utente definito non avrà (non può) avere i permessi per creare questi dbs comunque).Django unittest test database di sola lettura

Sicuramente questo è possibile - come dico io mi manca l'ovvio?

Grato per qualsiasi aiuto.

Mathew

risposta

1

Non ovvio, no. Sort-of documented, è possibile impostare il nome del database da utilizzare durante il test:

settings.py

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

Se si vuole allora non costruire (o ricostruire) il database di test, è necessario duplicare il database nome in TEST_NAME e utilizza il nuovo comando python manage.py test--keepdb per lasciare intatto il database, piuttosto che fare in modo che Django cerchi di eliminarlo tra una sessione e l'altra. A partire da giugno 2014 è necessario eseguire l'aggiornamento alla versione di sviluppo di Django per accedervi; alla fine questo sarà nella versione stabile. Il lato negativo di questo è, a quanto ho capito, si applica a tutti i database, non solo quelli di sola lettura.

+1

Grazie ma penso che abbiamo attraversato fili ?! Il mio problema non è che voglio controllare il nome di qualsiasi database di test creato, è che non voglio creare quelli di test, tranne che per default. Quindi, invece di girare un duplicato vuoto, voglio che i miei test utilizzino il DB elencato nelle impostazioni per i test poiché è di sola lettura e fornisce i record necessari nei test. – Mathew

+0

@Mathew si potrebbe essere in grado di ottenere la maggior parte del modo lì, vedere le modifiche – Josh

+2

Il problema per molti di noi che l'intero host è di sola lettura per alcuni di questi dbs secondario. La specifica di un nome db diverso non aiuta. – shacker

0

Ho avuto lo stesso problema e sono riusciti a risolverlo in questo modo:

settings.py

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

DATABASE_ROUTERS = ['routers.MyRouter'] 

... 

TESTING = 'test' in sys.argv 

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

Se non si utilizza db hard coded di routing come ad esempio con 'using' e utilizza solo il 'DATABASE_ROUTERS', quindi questa soluzione dovrebbe essere abbastanza buona per te.

Ovviamente, se si desidera testare realmente la connessione al DB remoto e ai dati memorizzati lì, questa non sarebbe la strada da percorrere.

+2

Questa tecnica impedisce di creare 'test_other', ma causerà problemi di test per le viste che utilizzano dati che vivono in 'altro' (poiché è effettivamente passato dall'intera app). – shacker

Problemi correlati