読み取り専用プロパティをモックするにはどうすればいいですか?モック?
私は試した:
setattr(obj.__class__, 'property_to_be_mocked', mock.Mock())
しかし問題は、それがクラスのすべてのインスタンスに適用され、テストが壊れてしまうことです。
他に何かアイデアはありますか? オブジェクト全体をモックするのではなく、この特定のプロパティだけをモックしたいのです。
ベストアンサー1
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()