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

