2012-07-23 8 views
18

Zastanawiam się, jak działa metoda TestCase.assertQuerysetEqual. Próbowałem go na różne sposoby, każdy z nich prowadził mnie do innego komunikatu o błędzie.Django 1.4 - assertQuerysetEqual - jak korzystać z metody

#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) 

Komunikat o błędzie dla liczba1:

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

Komunikat o błędzie dla Number 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 

Dzięki za podpowiedzi, jak prawidłowo używać metody assertQuerysetEqual.

Odpowiedz

12

spróbuj tego:

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

to trochę dziwne i nieudokumentowane; ale to powinno działać dla ciebie.

27

assertQuerysetEqual trwa queryset, a listę wartości a transform wywoływalnym który wezwał queryset, aby przekształcić go w coś porównywalnego do listy wartości. Domyślnie ta wartość to repr. Jest to trochę irytujące, ponieważ w rzeczywistości nie porównuje dwóch zestawów zapytań, ale łatwa do rozwiązania w większości przypadków jest użycie map(repr, your_second_queryset) dla listy wartości. To jest documented in django since version 1.3.

+0

Dzięki za wyjaśnienie! –

+1

Używając python 3 + django 1.5 powinieneś użyć 'map (repr, your_second_queryset)' ponieważ assertQuerysetEqual konwertuje queryset na listę. –