如何在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
相关产品推荐
相关产品推荐

