web-dev-qa-db-ja.com

モックパッチを使用してインスタンスメソッドをモックする

Djangoアプリを想像上の名前で モックテストライブラリ を使用してテストしているときに、モックを作成しようとしています。これをしようとしています:

models.py

from somelib import FooClass

class Promotion(models.Model):
    foo = models.ForeignKey(FooClass)
    def bar(self):
       print "Do something I don't want!"


test.py

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    def test_enter_promotion(self):
        @patch.object(my_app.models.FooClass, 'bar')
        def fake_bar(self, mock_my_method):
            print "Do something I want!"
            return True

        self.client.get(reverse(view))

何が間違っていますか?

67
Kit Sunde

ああ、そのパッチデコレータをどこに適用するのか混乱していました。一定:

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    @patch.object(my_app.models.FooClass, 'bar')
    def test_enter_promotion(self, mock_method):
        self.client.get(reverse(view))
30
Kit Sunde

キットの答えに追加するには、patch.object()に3番目の引数を指定すると、モックされたオブジェクト/メソッドを指定できます。それ以外の場合、デフォルトのMagicMockオブジェクトが使用されます。

_    def fake_bar(self):
        print "Do something I want!"
        return True

    @patch.object(my_app.models.FooClass, 'bar', fake_bar)
    def test_enter_promotion(self):
        self.client.get(reverse(view))
        # Do something I want!
_

モックオブジェクトを指定すると、デフォルトのMagicMock()no(パッチされたオブジェクトに渡されます)もはや:

_def test_enter_promotion(self, mock_method):
_

代わりに:

_def test_enter_promotion(self):
_

http://www.voidspace.org.uk/python/mock/patch.html#patch-object

54
storm_m2138