Ho scritto test di Django usando django.test.TestCase e mi piacerebbe utilizzare un dispositivo con tutti i dati del mio database corrente per eseguire i test. Tuttavia, se creo l'apparecchio come segue:Django manage.py test non può caricare correttamente il dispositivo
python manage.py dumpdata --indent=3 > myapp/fixtures/test_data.json
quando ho quindi eseguire il test utilizzando python manage.py test myapp
, ottengo il seguente errore:
Problem installing fixture...(traceback)
IntegrityError: Could not load auth.Permission(pk=42): duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key"
DETAIL: Key (content_type_id, codename)=(14, add_record) already exists.
Ho letto da qualche parte, in modo che questo potrebbe essere causato da un conflitto pk così ho poi provato a ricreare l'apparecchio con:
python manage.py dumpdata --natural --indent=3 > myapp/fixtures/test_data.json
Ma ora l'esecuzione del test mi dà:
01.235.Problem installing fixture...(traceback)
DeserializationError: 'NoneType' object has no attribute '_meta'
Ho anche provato in vari modi ad esclusione (utilizzando l'opzione --exclude
) auth.permission
e contenttypes
(o entrambi contemporaneamente), ma poi ho ottenere lamentele sulle autorizzazioni mancanti (Key (permission_id)=(44) is not present in table "auth_permission".
) o tipi di contenuto mancanti (DeserializationError: ContentType matching query does not exist.
)
Il La cosa è che ho bisogno di permessi comunque perché i miei test sono in parte per verificare che solo gli utenti con permessi specifici possano accedere ad alcune visualizzazioni.
Non capisco perché questo sta accadendo, ad essere onesti - la mia impressione è che il test runner inizia con un database completamente pulito e carica TUTTO il mio apparecchio, ma leggere post come questo: Django unit-testing with loading fixtures for several dependent applications problems fa sembrare come forse non è il caso.
Come posso aggirare questo? Preferirei mille volte non c'è bisogno di scrivere cose come User.objects.create_user(..
tonnellate di volte sotto def setUp(self):
nel mio test solo per avere abbastanza oggetti per loro di correre correttamente ...
Per chiunque trovare questo con un problema simile, ecco un'intuizione fondamentale: se voi modelli contengono una relazione M2M, NON scaricare la tabella M2M nell'attrezzatura di prova! In caso contrario, il M2M verrà popolato per la prima volta quando vengono creati gli oggetti correlati e quindi AGAIN quando i dati M2M vengono caricati dal dispositivo, causando quindi un errore di integrità. – powderflask