如何使用随机排序的元素测试查询集的正确设置?

时间:2012-04-16 12:13:21

标签: django django-testing

假设我有以下功能:

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, '?' )

那么我如何测试函数是否返回正确的查询集,而不是强力比较所有其他查询集?

3 个答案:

答案 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())

此外,我认为您需要一个更简洁的函数来返回这些查询集。