2013-04-07 21 views
1

我使用模擬更換一個Django模型,它的配置如下:你如何聲明Django的QuerySet.count()方法在模擬上被調用?

>>> config = {'objects.filter.return_value.count.return_value': 1} 
>>> MockModel = Mock(**config) 

我可以查詢一些值,然後在調用的結果.count()

>>> # This works as expected 
>>> MockModel.objects.filter(foo='bar').count() 
1 

然而當我斷言,這些方法被稱爲,模擬引起了TypeError因爲 count是模擬的call的方法:

>>> MockModel.assert_has_calls([ 
     call.objects.filter(foo='bar'), 
     call.objects.filter().count(), 
    ]) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-78-bf4e954d856f> in <module>() 
     1 MockModel.assert_has_calls([ 
     2   call.objects.filter(foo='bar'), 
----> 3   call.objects.filter().count() 
     4 ]) 

TypeError: count() takes exactly one argument (0 given) 

雖然,你可以看到,這個調用並在mock_calls存在:

>>> MockModel.mock_calls 
[ 
    call.trait_names(), 
    call._getAttributeNames(), 
    call.objects.filter(foo='bar'), 
    call.objects.filter().count(), # How do you test for this? 

    ... 
] 

所以我的問題是這樣的:你如何斷定count()拜訪了一個模擬Django的查詢集?

+0

你可以這樣做:'聲明MockModel.objects.filter()。count.called',但如果調用的順序很重要,這並不能給你提供正確的信息。 – 2013-04-18 02:07:50

回答

2

一個call也是tuple,因此可以進行比較的tuple

>>> MockModel.assert_has_calls([ 
     call.objects.filter(foo='bar'), 
     ('objects.filter().count',), 
    ]) 

可以證實這一點:

>>> map(tuple, MockModel.mock_calls) 
    > [('objects.filter',(), {'foo': 'bar'}), ('objects.filter().count',(), {})] 

來源:https://code.google.com/p/mock/source/browse/mock.py#1988

+0

非常酷,這個工程,正是我一直在尋找。謝謝! – 2013-04-18 02:06:45

相關問題