2012-07-23 26 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號錯誤消息:

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。

回答

12

試試這個:

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

這是一個有點怪異和無證;但是,這應該適合你。

27

assertQuerysetEqual需要queryset,值的列表和transform調用這就是所謂的查詢集將其轉換成東西比得上值的列表。默認情況下,這個可調用的是repr。這有點令人煩惱,因爲它實際上並沒有比較兩個查詢集,但大多數情況下的簡單修正是使用map(repr, your_second_queryset)作爲值列表。這是documented in django since version 1.3

+0

謝謝澄清! – 2013-01-07 07:08:44

+1

使用python 3 + django 1.5,你應該使用map(repr,your_second_queryset)'因爲assertQuerysetEqual將queryset轉換爲列表。 – 2013-01-10 20:03:11