模拟变量并将其替换为对象



我想测试这段代码:

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

在这个测试中,我需要模拟一个全局变量modify,并用对象替换它。我一直在尝试这样做:

# 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 name='modify.create_user()' id='140375141136512'>

如何使此功能正常工作?

我用某种变通方法解决了这个问题。我并没有嘲笑整个对象,而是嘲笑了我使用的函数。不需要使用另一个函数,因为它在其他测试中进行了测试,所以我用常数值替换了它。我只检查了给定的参数是否正确,其他的都是其他测试任务。

@mock.patch("application.user.user_rest_adapter.modify.create_user")
def test_create_user_should_create(create_user_mock, client):
# given
user_id = "a20d7a48-7235-489b-8552-5a081d069078"
create_user_mock.return_value = UUID(user_id)
# when
response = client.post("/user", headers={"Accept": "application/json", "Content-Type": "application/json"},
json={"username": "GALJO", "password": "qwerty123"})
# then
args = create_user_mock.call_args.args
assert args[0].username == "GALJO"
assert args[0].password == "qwerty123"
assert response.json["userID"] == user_id

最新更新