2012-07-23 12 views
18

Tôi tự hỏi phương thức TestCase.assertQuerysetEqual hoạt động như thế nào. Tôi đã thử nó theo những cách khác nhau, mỗi người trong số họ dẫn tôi đến một thông báo lỗi khác.Django 1.4 - assertQuerysetEqual - cách sử dụng phương pháp

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

Thông báo lỗi cho Number1:

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

Thông báo lỗi cho Số 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 

Cám ơn gợi ý làm thế nào để sử dụng phương pháp assertQuerysetEqual một cách chính xác.

Trả lời

12

thử điều này:

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

đó là một chút kỳ lạ và không có giấy tờ; nhưng, điều đó sẽ phù hợp với bạn.

27

assertQuerysetEqual mất một queryset, một danh sách các giá trị và một transform callable được gọi là trên queryset để chuyển đổi nó thành một cái gì đó tương đương với danh sách các giá trị. Theo mặc định, số này có thể gọi là repr. Đây là loại khó chịu vì nó không thực sự so sánh hai queryset, nhưng sửa chữa dễ dàng cho hầu hết các trường hợp là sử dụng map(repr, your_second_queryset) cho danh sách các giá trị. Đây là documented in django since version 1.3.

+0

Cảm ơn bạn đã làm rõ! –

+1

Sử dụng python 3 + django 1.5 bạn nên sử dụng 'map (repr, your_second_queryset)' vì assertQuerysetEqual chuyển đổi queryset thành một danh sách. –