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


82

想像上の名前のモックテストライブラリを使用して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))

私は何が間違っているのですか?


bar実際には「インスタンスメソッド」であり、その唯一のパラメータはselfです。クラスメソッドであるためには、でパラメータ化する必要がありcls、として呼び出すことができますPromotion.foo()
cavaunpeu 2015

:パッチ適用可能なオブジェクトは次のように引用される必要がある @patch.object('my_app.models.FooClass', 'bar')
Lasma

2
@cavaunpeu -ない(だけ)でパラメータclsが、より重要なのは(以降selfおよびclsPythonで平均ない何も特別な操作を行う)、飾ら@classmethod
dwanderson

回答:


67

キットの回答に追加するには、3番目の引数をpatch.object()指定して、モックオブジェクト/メソッドを指定できるようにします。それ以外の場合は、デフォルトの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()が渡されなくなることに注意してください。

def test_enter_promotion(self, mock_method):

代わりに:

def test_enter_promotion(self):

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


私はこの実装を好みます。特にユニットテストの初心者にとっては、より明確です。
ドルシオマン

35

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

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

20
現在、モックのメソッドと偽の実装をどこで結び付けていますか?
物理的な

@physicalattractionの場合、接続はmock_methodテスト関数に渡された引数によって行われます。私は自分のテストの1つでこのテクニックを使用することができました。これは、モックされたメソッドが呼び出されたかどうかのみを確認する場合に役立ちます。
Kalyan Vedala 2018

@ rcode74:テストメソッド内の(他のオブジェクト)インスタンスのメソッドにパッチを適用する方法。例:def my_method_to_be_tested(...):r = some_script.some_class(...); r.how_to_patch_this_method。
imsrgadich

1
@ imsrgadich、r.how_to_patch_this_method = MagicMock()のようなことをします。MagicMockのドキュメントをチェックして、モックオブジェクトに動作を割り当てる方法を確認できます。
Kalyan Vedala 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.