2012-07-23 13 views
18

私はTestCase.assertQuerysetEqualメソッドがどのように機能するのだろうかと思います。私は別の方法で試してみましたが、それぞれ別のエラーメッセージにつながっていました。Django 1.4 - assertQuerysetEqual - メソッドの使い方

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

番号1のエラーメッセージ:

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

ナンバー2のエラーメッセージ:正しくassertQuerysetEqualメソッドを使用する方法のヒントについて

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 

感謝。

答えて

12

はこの試してみてください。

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

それは少し奇妙な、文書化されていないのですが。しかし、それはあなたのために働くはずです。

27

assertQuerysetEqualは、値と値のリストに匹敵する何かに変換するクエリセットで呼び出されtransform呼び出し可能なのリストをquerysetかかります。デフォルトでは、この呼び出し可能ファイルはreprです。これは実際には2つのクエリーセットを比較しないので辛いですが、ほとんどの場合の簡単な修正では値のリストにmap(repr, your_second_queryset)を使用しています。これはdocumented in django since version 1.3です。

+0

ご清聴ありがとうございます! –

+1

python 3 + django 1.5を使うと、assertQuerysetEqualはクエリーセットをリストに変換するので、 'map(repr、your_second_queryset)'を使うべきです。 –

関連する問題