22

TestCase.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)

Number1 のエラー メッセージ:

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

番号 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

assertQuerysetEqual メソッドを正しく使用する方法のヒントをありがとう。

4

2 に答える 2

35

assertQuerysetEqualqueryset、値のリスト、およびtransformクエリセットで呼び出されて値のリストに相当するものに変換する呼び出し可能オブジェクトを取ります。デフォルトでは、この callable はrepr. 実際には 2 つのクエリセットを比較しないため、これはちょっといらいらしますが、ほとんどの場合map(repr, your_second_queryset)、値のリストに を使用することで簡単に修正できます。これは、バージョン 1.3 以降の django で文書化されています。

于 2013-01-07T02:20:03.967 に答える
20

これを試して:

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

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

于 2012-09-25T20:35:30.047 に答える