Подтвердить что ты не робот

Django 1.4 - assertQuerysetEqual - как использовать метод

Мне интересно, как работает метод 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.

4b9b3361

Ответ 1

попробуйте следующее:

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

это немного странно и недокументировано; но это должно сработать для вас.

Ответ 2

assertQuerysetEqual принимает queryset, список ценностей и transform вызываемого, который называется на QuerySet, чтобы превратить его в нечто сравнимое список значений. По умолчанию этот вызываемый объект является repr. Это отчасти раздражает, поскольку фактически не сравнивает два map(repr, your_second_queryset), но в большинстве случаев проще всего использовать map(repr, your_second_queryset) для списка значений. Это задокументировано в django начиная с версии 1.3.