Python 将上下文管理器修补到 return 对象

Python patch context manager to return object

我正在尝试修补执行数据库查找和 returns 如下对象的上下文管理器:

class MyClass:
    @contextlib.contextmanager
    def client_ctx(self, id):
         # hidrate from DB and yield object
         yield client # instance of SQAlchemy model Client

    def run(self, id):
        with self.client_ctx(id) as cl:
            # do work here

本例中的客户端 class 是一个 SQLAlchemy 模型。

在我的测试中,我试图将此方法 client_ctx 修补为简单地 return 在测试中实例化的对象,如下所示:

@patch('MyClass.client_ctx')
def test_ctx(self, _mocked_ctx_manager):
    myclass = MyClass()

    client = Client(
        id=1,
        code='test-client')

    _mocked_ctx_manager.__enter__.return_value = client
    myclass.run(1)

我得到:TypeError: Object of type MagicMock is not JSON serializable 这对我来说毫无意义。我做错了什么,有没有更好的方法来模拟上下文管理器?

以下应该有效:

_mocked_ctx_manager.return_value.__enter__.return_value = client

您的 _mocked_ctx_manager returns 上下文管理器。因此你需要设置__enter__.return_value of _mocked_ctx_manager.return_value.

我发现以下文章很有帮助:Surrender Python Mocking! I Have You Now.