【问题标题】:Django 1.4 - assertQuerysetEqual - how to use methodDjango 1.4 - assertQuerysetEqual - 如何使用方法
【发布时间】:2012-07-21 14:16:57
【问题描述】:

我想知道 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 方法。

【问题讨论】:

    标签: django testing django-queryset


    【解决方案1】:

    assertQuerysetEqual 接受一个queryset、一个值列表 和一个transform 可调用对象,该可调用对象在查询集上被调用以将其转换为与值列表相当的内容。默认情况下,此可调用对象为 repr。这有点烦人,因为它实际上并没有比较两个查询集,但对于大多数情况来说,简单的解决方法是使用 map(repr, your_second_queryset) 作为值列表。这是documented in django since version 1.3

    【讨论】:

    • 使用 python 3 + django 1.5 你应该使用 map(repr, your_second_queryset) 因为 assertQuerysetEqual 将查询集转换为列表。
    【解决方案2】:

    试试这个:

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

    这有点奇怪和无证;但是,这应该对你有用。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 2019-11-05
      • 1970-01-01
      • 2012-04-28
      • 2013-04-04
      • 2013-04-01
      • 2012-11-13
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多