1. ホーム
  2. python

[解決済み] readonlyプロパティをmockでモックするには?

2022-05-18 11:03:34

質問

読み取り専用のプロパティを モック ?

試してみました。

setattr(obj.__class__, 'property_to_be_mocked', mock.Mock())

が、問題は、それがクラスのすべてのインスタンスに適用されることです...これは私のテストを壊します。

何か他のアイデアはありますか?私は完全なオブジェクトをモックしたくないのですが、この特定のプロパティだけです。

どのように解決するのですか?

私は、より良い方法は、プロパティのモックを PropertyMock をモックするよりも、むしろ __get__ メソッドを直接モックするのではありません。

に記載されています。 ドキュメント を検索すると unittest.mock.PropertyMock : クラスのプロパティやその他の記述子として使用されることを意図したモックです。 PropertyMock__get____set__ メソッドを使用することで、取得時に戻り値を指定することができます。

以下はその方法です。

class MyClass:
    @property
    def last_transaction(self):
        # an expensive and complicated DB query here
        pass

def test(unittest.TestCase):
    with mock.patch('MyClass.last_transaction', new_callable=PropertyMock) as mock_last_transaction:
        mock_last_transaction.return_value = Transaction()
        myclass = MyClass()
        print myclass.last_transaction
        mock_last_transaction.assert_called_once_with()