2012-05-11 15 views
6

私は、次のシナリオがあります。私のutils.pyファイルに私のmodels.pyでモッキングDjangoのモデルと保存()

class FooBar(models.Model): 
    description = models.CharField(max_length=20) 

を。 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 !!! 

これは私が何をしようとしているの簡易版...ので、私はutilsのファイルを持っている理由にhungup取得しないでくださいとで

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() 

このためのヘルパー関数(実際にはいくつかのことをしています)。また、簡略化したものの、これは私の問題の実際の実例です。 call_countをテストする最初の呼び出しは1を返し、成功します。しかし、2番目のものは0を返します。したがって、私のパッチが動作していて、呼び出されているように見えます。

FooBarのインスタンスが作成されるだけでなく、その保存メソッドが呼び出されることをテストするにはどうすればよいですか?ここで

答えて

7

があなたの問題であり、あなたが現在いる:mock_foobar_class以来

mock_foobar_class.save = save_mock 

が嘲笑クラスのオブジェクトであり、saveメソッドは、そのクラス(ないクラス自体)のインスタンスで呼び出され、次のようにする必要がありクラスの戻り値(別名インスタンス)でsaveが呼び出されることをアサートします。

はこれを試してみてください:

mock_foobar_class.return_value.save = save_mock 

私はそれが役に立てば幸い!

+2

あなたは答えに私を打つ! – fuzzyman

+0

私の質問に応答するUpvote!どうもありがとうございました! –

+0

@matthew!どうもありがとうございました! –