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

Python测试中Mock全局变量modify后create_user方法无法执行怎么办?

问题

需要测试以下Flask接口代码:

modify: UserModifyPort = _ports_.user_modify_port


@_app_.route(f"/user", methods=["POST"])
@headers_check({"Accept": "application/json", "Content-Type": "application/json"})
def create_user():
    body_json = request.get_json()
    body = UserCreateRequest(body_json["username"], body_json["password"])
    cmd = UserCreateCmd(body.username, body.password)
        
    # modify usage
    user_id = modify.create_user(cmd)
        
    response = UserCreateResponse(user_id)
    return response.to_dict(), 201

测试时希望Mock全局变量modify,替换为DatabaseUserModifyAdapter的实际对象,尝试了以下写法:

# TEST
@mock.patch("application.user.user_rest_adapter.modify")
def test_create_user_should_create(modify_mock, db_engine, client, user_config):
    modify_mock.return_value = DatabaseUserModifyAdapter(db_engine, user_config)
    response = client.post("/user", headers={"Accept": "application/json", "Content-Type": "application/json"},
                           json={"username": "GALJO", "password": "qwerty123"})

但modify.create_user()并未执行实际逻辑,仅返回MagicMock对象:

<MagicMock name='modify.create_user()' id='140375141136512'>

请问如何让该方法正常执行?

解决方案

问题出在对mock.patch的用法上:modify是一个全局变量,而非可调用的函数/类,不需要用return_value赋值,直接给modify_mock本身赋值实际实例即可。

修正后的测试代码:

# TEST
@mock.patch("application.user.user_rest_adapter.modify")
def test_create_user_should_create(modify_mock, db_engine, client, user_config):
    # 直接给mock对象赋值实际实例,而非设置return_value
    modify_mock = DatabaseUserModifyAdapter(db_engine, user_config)
    response = client.post("/user", headers={"Accept": "application/json", "Content-Type": "application/json"},
                           json={"username": "GALJO", "password": "qwerty123"})

原因说明

  • 当用mock.patch替换一个全局变量时,modify_mock就是这个变量的代理对象,直接赋值实际实例会覆盖mock的默认MagicMock行为。
  • 原写法中的return_value是用于当mock对象是可调用对象(比如函数、类构造器)时,设置调用它之后返回的值,但这里modify是一个已初始化的变量,不需要调用,因此return_value不会生效。

内容的提问来源于stack exchange,提问作者Jan Oleński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:45:25