可以同时修补多个对象属性吗?

Can multiple object attributes be patched at the same time?

我希望减少测试中的嵌套,我正在查看 with patch.multiple() 以了解下面的类似内容,但无法找到让它工作的方法。

其中mock_task_instancemock_dag_runsuccess_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()