2012-04-16 4 views
1

は、私は次の関数があるとします。この関数は、戻り値としてランダムに注文したクエリセットを持っています:どのようにランダムに順序付けられた要素を持つクエリーセットの正しいセットアップをテストできますか?

queryset = User._default_manager.all().order_by('?') 

今その機能についての唯一の重要なことがある

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 

が今ここに質問です正しいクエリーセットを返す必要があります。私ができるような方法でクエリーセットにアクセスする方法がありますか?このような何か:関数は、他のすべてのクエリセットと比較ブルートフォースせず、正しいクエリセットを返す場合

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で並べ替えることができます。そのため、順序はランダムな順序ではなくクエリーセットになります。クエリーセットを比較する最良の方法はありますが、わかりません。

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

関連する問題