6

次のシナリオがあります。

私の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 !!!

これは私がやろうとしていることの単純化されたバージョンです...だから、なぜ私がutilsファイルとこれのためのヘルパー関数を持っているのか(実際にはいくつかのことをします)に夢中にならないでください. また、簡略化されていますが、これは私の問題の実際の例です。test call_count への最初の呼び出しは 1 を返し、合格します。ただし、2 番目のものは 0 を返します。したがって、パッチが機能して呼び出されているように見えます。

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

4

1 に答える 1

8

これがあなたの問題です、あなたは現在持っています:

mock_foobar_class.save = save_mock

mock_foobar_classモック化されたクラス オブジェクトであり、saveメソッドはそのクラス (クラス自体ではなく) のインスタンスに対して呼び出されるため、クラス (別名インスタンス) の戻り値に対して save が呼び出されることをアサートする必要があります。

これを試して:

mock_foobar_class.return_value.save = save_mock

それが役立つことを願っています!

于 2012-05-14T14:16:19.900 に答える