2012-05-11 47 views
6

我有以下情形:嘲諷Django的模型和save()

在我的models.py

class FooBar(models.Model): 
    description = models.CharField(max_length=20) 
我utils.py文件

from models import FooBar 

def save_foobar(value): 
    '''acts like a helper method that does a bunch of stuff, but creates a 
    FooBar object and saves it''' 

    f = FooBar(description=value) 
    f.save() 
在tests.py

from utils import save_foobar 

@patch('utils.FooBar') 
def test_save_foobar(self, mock_foobar_class): 

    save_mock = Mock(return_value=None) 
    mock_foobar_class.save = save_mock 

    save_foobar('some value') 

    #make sure class was created 
    self.assertEqual(mock_foobar_class.call_count, 1) #this passes!!! 

    #now make sure save was called once 
    self.assertEqual(save_mock.call_count, 1) #this fails with 0 != 1 !!! 

這是我想要做一個簡化版本......所以請不要hungup爲什麼我有一個utils的文件和

這個輔助函數(在現實生活中它有幾件事情)。另外,請注意,雖然簡化,但這是我的問題的實際工作示例。第一次測試call_count的調用返回1並通過。然而,第二個返回0.所以,這看起來像我的補丁正在工作,並得到調用。

我該如何測試不僅FooBar的實例被創建,而且它的保存方法被調用?

回答

7

這是你的問題,你目前有:

mock_foobar_class.save = save_mock 

因爲mock_foobar_class是嘲笑類對象,而save方法調用這個類的(而不是類本身)的情況下,你需要斷言在類的返回值(即實例)上調用save。

試試這個:

mock_foobar_class.return_value.save = save_mock 

我希望幫助!

+2

你打我答案! – fuzzyman

+0

Upvote響應我的查詢!非常感謝你! –

+0

@matthew!非常感謝你! –