mock で読み取り専用プロパティをモックするにはどうすればいいですか? 質問する

mock で読み取り専用プロパティをモックするにはどうすればいいですか? 質問する

読み取り専用プロパティをモックするにはどうすればいいですか?モック?

私は試した:

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()

おすすめ記事