2012-04-16 1 views
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 в качестве возвращаемого значения:

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

Так как я могу проверить, если функция возвращает правильный QuerySet, без грубой силы по сравнению со всеми другими querysets?

ответ

4

Я думаю, что самым старшим способом является сравнение наборов (которые неупорядочены).

self.assertEqual(
    set(select_queryset(n-1)), 
    set(User._default_manager.all()) 
) 
1

Вы можете отменить заказ и отсортировать его по 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')) 
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()) 

Кроме того, я думаю, вам нужно более сжатое функцию, чтобы вернуть эти querysets.

+0

Я попробую. И не беспокойтесь о моей функции, это просто для того, чтобы показать проблему. Настоящий выглядит совсем по-другому :) – marue