假设我有以下功能:
def select_queryset(value_to_decide_upon):
""" this function returns either any of some querysets or nothing """
if value_to_decide_upon == 1:
return User._default_manager.all()
elif value_to_decide_upon == 2:
return User._default_manager.filter(pk__in=[some_more_values])
elif value_to_decide_upon == n-1:
return User._default_manager.all().order_by('?')
elif value_to_decide_upon == n:
return None
现在问题是:这个函数有一个随机排序的查询集作为返回值:
queryset = User._default_manager.all().order_by('?')
现在关于该功能的唯一重要事项是:它必须返回正确的查询集。有没有办法以我能够的方式访问查询集,即。做这样的事情:
class TestQuerysetSelection(TestCase):
def test_return_value(self):
# this, of course, will always fail:
self.assertEqual(select_queryset(n-1),
User._default_manager.all().order_by('?') )
# and this is not working as well
self.assertEqual( templatetag.queryset.order_by, '?' )
那么我如何测试函数是否返回正确的查询集,而不是强力比较所有其他查询集?
答案 0 :(得分:4)
我认为最明星的方法是比较集合(无序)。
self.assertEqual(
set(select_queryset(n-1)),
set(User._default_manager.all())
)
答案 1 :(得分:1)
您可以按pk覆盖排序并按pk排序,这样您就可以在查询集中订购,而不是随机排序。我不确定比较查询集的最佳方法是什么。
class TestQuerysetSelection(TestCase):
def test_return_value(self):
# Add `order_by('id')` to sort by id
self.assertEqual(select_queryset(n-1).order_by('id'),
User._default_manager.all().order_by('id') )
答案 2 :(得分:1)
尝试
qs1.query.sql_with_params() == qs2.query.sql_with_params()
# or simply
str(qs1.query) == str(qs2.query)
# for your code
self.assertEqual(select_queryset(n-1).query.sql_with_params(),
User._default_manager.all().order_by('?').query.sql_with_params())
此外,我认为您需要一个更简洁的函数来返回这些查询集。