Domanda

Ora sto facendo unità di test per il codice già esistente. Ho affrontato il problema successivo:

Dopo aver eseguito syncdb per la creazione di database di test, Django riempie automaticamente diversi tavoli come django_content_type o auth_permissions.

Poi, immagino ho bisogno di eseguire un test complesso, come verificare la registrazione degli utenti, che avrà bisogno di un lof ot tabelle di dati e le connessioni tra di loro.

Se cercherò di usare tutto il mio database esistente per fare infissi (che sarebbe piuttosto comoda per me) - riceverò l'errore come qui . Questo accade perché, Django ha già riempito le tabelle come django_content_type.

Il modo in cui accanto possibile è quella di utilizzare Django DumpData --exclude opzione per la già riempito con tavoli syncdb. Ma questo non funziona bene anche, perché se prendo gli oggetti utente e gruppo utente dal mio tavolo db e utente le autorizzazioni, che è stato automaticamente creato da syncdb, posso ricevere gli errori, perché le chiavi primarie, collegandoli ora puntano sbagliato. Questo è meglio descritta qui in parte 'apparecchio inferno', ma la soluzione mostrata c'è doensn't guardare bene)

Il prossimo possibile schema che vedo è prossimo:

  1. Io corro le mie prove; Django crea database di test, rende syncdb e crea tutte quelle tabelle.
  2. Nella mia messa a punto di test sto cadere questo database, la creazione del nuovo database vuoto.
  3. Dati carico del deposito dal database anche esistente nella configurazione di prova
È stato utile?

Soluzione

E 'così che il problema è stato risolto:

Dopo la syncdb ha creato il database di test, in parte impostazione del test che uso per accedere os.system conchiglia dal mio codice. Poi Sto solo il caricamento del dump del database, che voglio usare per le prove.

Quindi questo funziona così: syncdb riempie contenttype e alcune altre tabelle con i dati. Poi, nel setUp parte della prove di carico della discarica sql cancella tutti i dati creati in precedenza e ho un bel database.

Potrebbe non essere la soluzione migliore, ma funziona =)

Altri suggerimenti

Il mio approccio sarebbe utilizzare per primo del Sud per rendere le migrazioni DB facile (che non aiuta affatto, ma è bello), e quindi utilizzare un modulo di metodi di creazione del modello.

Quando si esegue

  $  manage.py test my_proj

Django con il Sud installato con creare il DB di prova, ed eseguire tutte le migrazioni di darvi un db di prova completamente aggiornato.

Per scrivere i test, prima creare una calle modulo Python, test_model_factory.py Qui creare funzioni che creano gli oggetti.

def mk_user():
   User.objects.create(...)

Poi, nel tuo test è possibile importare il modulo test_model_factory, e creare oggetti per ogni test.

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top