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.
我正在尝试修补执行数据库查找和 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.