可以同时修补多个对象属性吗?
Can multiple object attributes be patched at the same time?
我希望减少测试中的嵌套,我正在查看 with patch.multiple()
以了解下面的类似内容,但无法找到让它工作的方法。
其中mock_task_instance
、mock_dag_run
和success_mock_task_instance
定义在测试函数中。
所以我想知道是否有一种方法可以同时修补多个对象属性?
with patch.object(
mock_task_instance, "xcom_pull", side_effect=[self.file_name, self.config]
):
with patch.object(
mock_dag_run, "get_task_instances", return_value=[success_mock_task_instance]
):
with patch.object(
success_mock_task_instance, "current_state", return_value=State.SUCCESS
):
_my_func()
如果您正在寻找一种清理嵌套 with
块的方法,我建议您查看 contextlib.ExitStack()
,因为这可以帮助解决问题。
这是文档中的示例:
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
参见:https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack
对于您的代码,我认为它可能看起来有点像:
with contextlib.ExitStack() as stack:
stack.enter_context(patch.object(mock_task_instance, "xcom_pull", side_effect=[self.file_name, self.config]))
stack.enter_context(patch.object(mock_dag_run, "get_task_instances", return_value=[success_mock_task_instance]))
stack.enter_context(patch.object(success_mock_task_instance, "current_state", return_value=State.SUCCESS))
_my_func()
我希望减少测试中的嵌套,我正在查看 with patch.multiple()
以了解下面的类似内容,但无法找到让它工作的方法。
其中mock_task_instance
、mock_dag_run
和success_mock_task_instance
定义在测试函数中。
所以我想知道是否有一种方法可以同时修补多个对象属性?
with patch.object(
mock_task_instance, "xcom_pull", side_effect=[self.file_name, self.config]
):
with patch.object(
mock_dag_run, "get_task_instances", return_value=[success_mock_task_instance]
):
with patch.object(
success_mock_task_instance, "current_state", return_value=State.SUCCESS
):
_my_func()
如果您正在寻找一种清理嵌套 with
块的方法,我建议您查看 contextlib.ExitStack()
,因为这可以帮助解决问题。
这是文档中的示例:
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
参见:https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack
对于您的代码,我认为它可能看起来有点像:
with contextlib.ExitStack() as stack:
stack.enter_context(patch.object(mock_task_instance, "xcom_pull", side_effect=[self.file_name, self.config]))
stack.enter_context(patch.object(mock_dag_run, "get_task_instances", return_value=[success_mock_task_instance]))
stack.enter_context(patch.object(success_mock_task_instance, "current_state", return_value=State.SUCCESS))
_my_func()