用于返回对象的 Python 补丁上下文管理器



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

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

以下方法应该有效:

_mocked_ctx_manager.return_value.__enter__.return_value = client

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

我发现以下文章很有帮助:投降 Python 嘲笑!我现在有你了。

最新更新