プロダクションファイル(production_file.py)のために動作しませんです。のpython3のモックは、すべてのパス
class MyError(Exception):
pass
class MyClass:
def __init__(self):
self.value = None
def set_value(self, value):
self.value = value
def foo(self):
raise RuntimeError("error!")
class Caller:
def bar(self, smth):
obj = MyClass()
obj.set_value(smth)
try:
obj.foo()
except MyError:
pass
obj.set_value("str2")
obj.foo()
テストファイル(test.py):
import unittest
from unittest.mock import patch
from unittest.mock import call
from production_file import MyClass, Caller
class MyTest(unittest.TestCase):
def test_caller(self):
with patch('production_file.MyClass', autospec=MyClass) as MyClassMock:
my_class_mock_obj = MyClassMock.return_value
my_class_mock_obj.foo.side_effect = [MyError("msg"), "text"]
caller = Caller()
caller.bar("str1")
calls = [call("str1"), call("str2")]
my_class_mock_obj.set_value.assert_has_calls(calls)
if __name__ == '__main__':
unittest.main()
これ以上の作品。しかし、私はテストファイルに生産クラス(MyError、MyClassの、発信者)を移動し、アップデートパッチの場合:
with patch('test.MyClass', autospec=MyClass) as MyClassMock:
は、そのインスタンスメソッド「foo」がもはや嘲笑されます。
それは誰でも知っていますか?
私はまた、テストがmy_package/tests/test_file.pyにある間に、生産コードがmy_package/src/production_file.pyにある、より複雑なコードで同様の問題を経験しました。 Pythonはパスに対してエラーを起こさず、パスは正しいですが、モックは機能しません。
面白いですが...なぜ、パスが間違っていても、Pythonはエラーになりませんか? – Feoggou
何も間違っているので、間違った場所にパッチを当てているだけです。ファイル 'test.py'を持っていれば、' import test'で別の名前でロードされた同じファイルの2つのバージョンになります。 'if __name__ ==" __main__ ":test import MyClass ...'などを追加した場合、テスト用に使用しているクラスにパッチを当てているので、期待どおりに動作します。 –
私は、もっと複雑な状況にも問題があります。ここでは、my_package/src/my_file.pyとmy_package/tests/test.pyがあります。この場合、私のテストではpatch( "src.my_file.MyClass")を使用していますが、モックは機能しません。テストが実際にパッチを適用していることをデバッグ/ログに記録する方法はありますか? – Feoggou