在Django中进行测试时,我发现有两种不同的方法来测试涉及查询集的函数。第一种方法是:
test_instance = FooFactory()
self.assertListEqual(list(Foo.objects.all()), [test_instance])
第二个是:
test_instance = FooFactory()
self.assertQuerysetEqual(Foo.objects.all(), map(repr, [test_instance]))
这两个哪个更好?我从Django文档中读到,这就是
assertQuerysetEqual
的作用:断言查询集qs返回特定的值列表values。 使用函数transform比较qs和values的内容;默认情况下,这意味着比较每个值的repr()。如果repr()不能提供唯一或有用的比较,可以使用任何其他可调用对象。 默认情况下,比较也依赖于排序。如果qs没有提供隐式排序,可以将ordered参数设置为False,将比较转换为collections.Counter比较。如果顺序未定义(如果给定的qs未排序并且比较针对多个有序值),则会引发ValueError。
我看到这里有两件重要的事情:一个是比较每个值的
repr()
,另一个是assertQuerysetEqual
允许您使排序变成可选。对于第一点,我认为最好比较模型本身而不是它们的“repr”值,因为这样你就知道它们完全相同(尽管有人可能也会认为“repr”值应该是不同的)。
对于第二点,我可以看出无序比较可能很有用。然而,如果你正在专门测试某些不重要/易于模拟排序的内容,我看不到那里的优势。
我能想到的唯一论据是,“assertQuerysetEqual”(在上述假设下)更可读/直接表达其目的。
有没有什么实际区别在“self.assertListEqual(list(), [])”和“self.assertQuerysetEqual(, map(repr, []))”之间,我没有考虑到的?