2012-04-16 17 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 = 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

我認爲最明智的方式是比較集合(這是無序的)。

self.assertEqual(
    set(select_queryset(n-1)), 
    set(User._default_manager.all()) 
) 
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')) 
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()) 

此外,我認爲你需要一個更簡潔的函數返回這些查詢集。

+0

我會試試看。不要擔心我的功能,它只是在這裏顯示問題。真正的看起來有點不同:) – marue 2012-04-16 12:43:54

相關問題