私のアプリケーションの単体テストでは、常に@mock.patch
と@patch.object
デコレータを使用していました。しかし、デコレータを使用したときのユニットテストでは、 'TypeError:staticmethodオブジェクトはイテレータではありません'というエラーが表示されます。Pythonで '@ patch.object'と 'with patch.object'を使用する違いは何ですか?
同じコードで、mock.patch.object
またはmock.patch.object
を使用すると、すべて正常に機能します。
例えば、私のテストクラスで、私はこの方法を持っている:staticmethodオブジェクト:
@staticmethod
def my_mock():
...do something
私は、次のユニットテスト
@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)
def test_something(self, my_method_mocked):
...test something
をしようとすると、私ははTypeError「前に述べたエラーメッセージが表示されます。イテレータではありません '
しかし、私はこのよう
def test_something(self):
with patch.object(mymodule, "my_method") as mocked_method:
mocked_method.side_effect = self.my_mock
...test something
をしようとすると、その後、すべてが完璧に動作します。
モックとユニットテストに関するPythonのドキュメントを読んだことがありますが、この動作の説明は見つかりませんでした。
デコレータパターンとのパターンがの場合の違いは何ですか?私はこれについてもっと知ることができる場所?
だけで、この私のコードの構造がより明確にするために:
class TestClass(unittest.TestCase):
@staticmethod
def my_mock():
...mock
return service
# doesn't work
@mock.patch('mypackage.mymodule.my_method', side_effect=my_mock)
def test_something(self, my_method_mocked):
...test something
# work
def test_something(self):
with patch.object(mymodule, "my_method") as mocked_method:
mocked_method.side_effect = self.my_mock
...test something
私はTestClass.my_mock
を行うことができない理由です。私がしたら、私は参照エラーを取得します。
しかし、私は '@classmethod'のときにこのFoo.my_mockのようなメソッドしか参照できません。 '@ staticmethod'は動作しません。 –
'Foo.my_mock'は静的メソッドにアクセスする必要があります。静的メソッドとクラスメソッドの唯一の違いは、静的メソッドがそのクラスへの参照を引数として取得しないことです。 – chepner
静的メソッドとして 'my_mock'を使って' Foo.my_mock'と言ったような使い方をしようとすると、私はそれをすることができないというエラーが出ます。しかし、クラスメソッドとして 'my_mock'を宣言すると、私はそれを使うことができます。 –