Python Mock实战:如何在函数内部Mock run_insert方法?
解决Mock run_insert失败的问题
问题根源
- Mock路径错误:Python的
unittest.mock.patch需要针对被调用模块中导入的函数引用进行Mock,而非函数的原始定义路径。你的service_register函数在backened/services/service_register.py中导入并调用run_insert,实际执行的是该模块内的run_insert引用,因此必须Mockbackened.services.service_register.run_insert,而非原定义的backened.sql.query_functions.run_insert。 - 路径拼写失误:测试代码里的
backened.sqlquery_functions.run_insert存在拼写错误,正确路径应为backened.sql.query_functions.run_insert(不过这不是导致断言失败的核心原因)。 - Mock参数顺序颠倒:装饰器是从下往上生效的,参数列表中,最后一个装饰器对应的Mock对象要排在最前面。你当前的参数顺序搞反了,导致断言的是错误的Mock对象。
修正后的测试代码
"backened/tests/test_users.py" from unittest import mock, TestCase from backened.routes.register import user_register # 注意原代码中函数名是user_regsiter?需与实际定义保持一致 class TestUserRegistration(TestCase): @patch('backened.sql.query_functions.connection') @patch('backened.services.service_register.run_insert', return_value="executed") def test_service_reg_return_correct_data(self, mock_insert, mock_sqlalchemy): data = { "user_name": "testuser57", "password": "123456", "email_address": "testuser57@example.com", "dob": "2022-06-07 00:00:00", "address": "Ahmedabad", } m1 = mock.MagicMock() m1.get_json.return_value = data with mock.patch("backened.routes.register.request", m1): response = user_register() # 确保函数名与实际定义一致,原代码若为user_regsiter需同步修改 mock_sqlalchemy.assert_called_once() mock_insert.assert_called_once() self.assertEqual(response.json, {'Message': 'New user Created'}) self.assertEqual(response.status_code, 201) # 状态码单独断言,不要混在JSON断言中
额外提醒
- 统一函数名拼写:原代码中的
user_regsiter少了字母t,建议修改为user_register保持全局一致,避免调用出错。 - 按需Mock验证函数:如果
validate()函数会抛出异常或阻碍测试流程,建议同时Mockbackened.services.service_register.validate,让测试聚焦于run_insert的调用逻辑,不依赖校验环节的实现。
内容的提问来源于stack exchange,提问作者Naveen Pandia
相关产品推荐
相关产品推荐

