You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中用MagicMock模拟Airflow的context?

解决Airflow Context的Mock问题

先看目标方法的核心取值逻辑:

tenantname = context[strings.str_dag].params[strings.str_AF_tenant_name]

这里是字典索引访问(context[xxx]),而非属性访问(context.xxx),你之前尝试的context.dag这类写法和原代码的调用逻辑不匹配,导致Mock失败。以下是两种可行的解决方案:

方案1:直接构造普通字典(简单场景)

如果测试仅需要context提供正确的索引值,无需Mock其他方法/属性,直接构造符合结构的字典即可:

# 按原代码的索引逻辑构造字典
context = {
    strings.str_dag: {
        "params": {
            strings.str_AF_tenant_name: "testtenant"
        }
    }
}

# 调用目标方法
response = dag_init.resolve_sensitive_params(secret_pramset, context)

方案2:用MagicMock正确模拟字典索引

如果必须使用MagicMock(比如需要Mock context的其他属性/方法),需要模拟字典索引的行为:

from unittest.mock import MagicMock

context = MagicMock()
# 构造dag对应的Mock对象
dag_mock = MagicMock()
dag_mock.params = {strings.str_AF_tenant_name: "testtenant"}
# 让context[strings.str_dag]返回dag_mock
context[strings.str_dag] = dag_mock

# 继续设置其他Mock
make_request.return_value.json.return_value = {"ParameterValue": "secretval"}

# 调用目标方法
response = dag_init.resolve_sensitive_params(secret_pramset, context)
print(response)

之前尝试失败的原因

  • context.dag.return_value是模拟属性访问,但原代码用的是字典索引context[strings.str_dag],两者逻辑不匹配;
  • context.return_value = {"dag": "test"}是让context作为可调用对象返回字典,但原代码中context并未被调用,而是直接做索引访问。

内容的提问来源于stack exchange,提问作者MHegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:05:09