如何在Django中测试一个空的查询集?

时间:2012-03-12 15:23:49

标签: django unit-testing

我正在测试Django中的一个视图,该视图应该从对象中删除所有标记。为此,我使用这个断言:

self.assertEqual(list(Tag.objects.get_for_object(Animal.objects.get(pk=1))),[])

这很有效,因为我得到一个空列表作为回报。我将Django查询集包装在列表中以避免这种情况:

AssertionError: [] != []

将空Django查询集与空列表进行比较。

但由于这不是我喜欢的东西,我想知道是否有更好的方法来进行测试。

4 个答案:

答案 0 :(得分:29)

只需使用exists

即可
self.assertFalse(Tag.objects.get_for_object(Animal.objects.get(pk=1)).exists())

答案 1 :(得分:8)

self.assertEqual(Tag.objects.get_for_object(Animal.objects.get(pk=1).count(), 0)

如果要强制执行被评估为列表的查询集,也可以使用len()

另外assertQuerysetEqual也很有用,您可以与实例0f django.db.models.query.EmptyQuerySet进行比较!但在大多数情况下使用count()应该是最快的方法!

答案 2 :(得分:0)

在这种情况下,克里斯的答案有效。但是,您也可以使用:

# the_list = list(some_queryset)   # converting a queryset into a list
self.assertEqual(len(the_list), 0)

# to go directly from queryset:
self.assertEqual(some_queryset.count(), 0)

答案 3 :(得分:0)

正如@Bernhard 所指出的,您可以使用 self.assertQuerysetEquals,并将您的查询集与空查询集进行比较,虽然这是一个优雅的解决方案,但可能效率不高。

其他解决方案也有效,但这是我的:

self.assertEquals(Tag.objects.get_for_object(Animal.objects.get(pk=1), None)

我强烈建议不要在列表中转换 django 查询集。这是因为将查询集转换为列表需要将所有查询集加载到内存中并将其转换为 Python 对象。

为此目的存在查询集方法 count()exists() 等。