2012-07-23 11 views
18

Ich frage mich, wie die TestCase.assertQuerysetEqual-Methode funktioniert. Ich habe es auf verschiedene Arten ausprobiert, und jeder von ihnen hat mich zu einer anderen Fehlermeldung geführt.Django 1.4 - assertQuerysetEqual - Wie verwendet man Methode

#create a backup of all records in the tree 
tree_record_backup = list(Tree.objects.all()) 

#do some updates on another table, which should not affect the tree table if everything goes wrong 

#check if list of tree records did not changed 
tree_record_qs = Tree.objects.all() 
#Number1: 
self.assertQuerysetEqual(tree_record_qs,[repr(tree_record_backup)]) 
#Number2: 
self.assertQuerysetEqual(tree_record_qs,tree_record_backup) 

Fehlermeldung für Number1:

First list contains 21 additional elements. 
First extra element 1: 
node.pk: 2 - node: node2 - pk: 2 - level: 0 - ancestor: 2 

Fehlermeldung für Nummer 2:

AssertionError: Lists differ: ['<Tree: node.pk: 1 - node: ro... != [<Tree: node.pk: 1 - node: roo... 

First differing element 0: 
<Tree: node.pk: 1 - node: root - pk: 1 - level: 0 - ancestor: 1> 
node.pk: 1 - node: root - pk: 1 - level: 0 - ancestor: 1 

Danke für Hinweise, wie man richtig die assertQuerysetEqual Methode verwenden.

Antwort

12

versuchen Sie dies:

self.assertQuerysetEqual(
    tree_record_qs, 
    [repr(r) for r in tree_record_backup] 
) 

es ein bisschen komisch und undokumentiert ist; aber das sollte für dich funktionieren.

27

assertQuerysetEqual nimmt eine queryset, eine Werteliste und transform aufrufbar, die auf dem queryset genannt wird es in etwas zu umwandeln vergleichbar mit der Werteliste. Standardmäßig ist diese aufrufbare Funktion repr. Das ist etwas ärgerlich, da es nicht zwei Abfragegruppen vergleicht, aber die einfache Lösung für die meisten Fälle ist map(repr, your_second_queryset) für die Liste der Werte. Dies ist documented in django since version 1.3.

+0

Danke für die Klärung! –

+1

Mit python 3 + django 1.5 sollten Sie 'map (repr, your_second_queryset)' verwenden, weil assertQuerysetEqual das queryset in eine Liste konvertiert. –

Verwandte Themen