1

假设我有以下功能:

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

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

4

3 回答 3

4

我认为最简单的方法是比较集合(无序的)。

self.assertEqual(
    set(select_queryset(n-1)),
    set(User._default_manager.all())
)
于 2012-04-16T12:48:03.357 回答
1

您可以覆盖 order by 并按 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') )
于 2012-04-16T12:21:52.793 回答
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())

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

于 2012-04-16T12:22:14.270 回答