Python修补程序上下文管理器以返回对象

问题描述 投票:1回答:1

我正在尝试修补上下文管理器,该上下文管理器执行数据库查找并返回如下对象:

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

在这种情况下,客户端类是SQLAlchemy模型。

在我的测试中,我试图修补此方法client_ctx以仅返回在测试中实例化的对象,如下所示:

@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,这对我来说毫无意义。我在做什么错,有没有更好的方法模拟上下文管理器?

python mocking contextmanager
1个回答
0
投票

以下应该起作用:

_mocked_ctx_manager.return_value.__enter__.return_value = client

您的_mocked_ctx_manager返回上下文管理器。因此,您需要设置__enter__.return_value_mocked_ctx_manager.return_value

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

© www.soinside.com 2019 - 2024. All rights reserved.