アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Python テストでクラスメソッドをモックする方法(unittest.mock)

f:id:otoyo0122:20200814122422p:plain:w300

Python3において、メソッドをモックしてテストしたいときがあります。

メソッドのモックにはunittest.mock.MagicMockがよく使われます。

しかし、MagicMockを使ってクラスメソッドをモックすると、テストケース終了後も影響が残ってしまいます。

このエントリでは、範囲を限定してクラスメソッドをモックする方法を紹介します。

範囲を限定してクラスメソッドをモックする方法

MagicMockでクラスメソッドをモックした場合、インスタンスメソッドと違って、テストケース終了後も影響が残ってしまいます。

これは、インスタンスとクラスのライフサイクルの違いによるものです。

同じインスタンスを使い回している場合には、インスタンスメソッドにも同じことが起こります。

範囲を限定してメソッドをモックするにはpatchメソッドを使います。

patchメソッドを使うにはunittest.mockモジュールからインポートします。

from unittest.mock import MagicMock, patch

with patch('module.Foo.bar', MagicMock(return_value='mocked value')):
    # call method

こうすることで、withブロック内においてmodule.Foo.barメソッドは'mocked value'を返します。

また、patchメソッドは@patch('module.Foo.bar', 'mocked_value')のようにデコレータとして使うこともできます。

詳しくは下記をご覧ください。

以上です。

このエントリでは、範囲を限定してクラスメソッドをモックする方法を紹介しました。