web-dev-qa-db-ja.com

オブジェクトの単一のメソッドのみをモックする

私はJavaのMockitoなど、他の言語の他のモックライブラリに精通していますが、Pythonのmockライブラリは私の人生を混乱させます。

次のクラスをテストしたいと思います。

class MyClassUnderTest(object):

    def submethod(self, *args):
       do_dangerous_things()

    def main_method(self):
       self.submethod("Nothing.")

私のテストでは、main_methodが実行されたときにsubmethodが呼び出され、正しい引数で呼び出されたことを確認したいと思います。 submethodは危険なことをするので、実行したくありません。

どうやってこれを始めたらいいのか全くわかりません。モックのドキュメントは非常に理解しにくく、何をモックするのか、どのようにモックするのかわかりません。

main_methodの機能をそのままにして、submethod関数をモックするにはどうすればよいですか?

28
Naftuli Kay

あなたが探しているのはmock.patch.object

with mock.patch.object(MyClassUnderTest, "submethod") as submethod_mocked:
    submethod_mocked.return_value = 13
    MyClassUnderTest().main_method()
    submethod_mocked.assert_called_once_with(user_id, 100, self.context,
                                             self.account_type)

ここに小さな説明があります

 patch.object(target, attribute, new=DEFAULT, 
              spec=None, create=False, spec_set=None, 
              autospec=None, new_callable=None, **kwargs)

オブジェクト(ターゲット)の名前付きメンバー(属性)にモックオブジェクトをパッチします。

33
oleg