Python API测试Mock使用问题:单元测试报错排查
单元测试代码中的问题分析
核心问题梳理
- Mock目标完全错误:你当前patch的是要测试的
MyClass.get_access_token方法本身,这等于直接跳过原方法的业务逻辑,完全失去了单元测试的意义。正确的做法是Mock外部依赖requests.post——原方法的核心逻辑是调用这个第三方接口获取token,我们需要Mock这个接口的返回,来验证原方法的处理逻辑。 - 类导入方式错误:原文件是
myclass.py,测试代码里import MyClass会把整个模块导入,而非模块内的MyClass类,实例化时会直接抛出类型错误。正确写法是from myclass import MyClass。 - 返回值断言与Mock设置不匹配:
- 原方法
get_access_token返回的是从响应中提取的access_token字符串,而非响应对象,但你却断言response.status_code——字符串没有这个属性,必然触发属性错误。 - 原方法通过
response.json().get('access_token')获取值,你设置的_access.return_value.json.return_value = mock_access_token不符合数据结构,应该让json返回包含access_token字段的字典。
- 原方法
修正后的测试代码示例
import os import unittest from unittest.mock import patch, MagicMock from myclass import MyClass # 修正类导入方式 class TestModule(unittest.TestCase): def test_execute(self): # 模拟环境变量,避免依赖真实环境配置 with patch.dict(os.environ, {'username': 'test_user', 'password': 'test_pass'}): _obj = MyClass(login_url="https://www.my-website.com/login/") mock_access_token = "abc123def456ghi789" # 正确Mock myclass模块内的requests.post方法 with patch('myclass.requests.post') as mock_post: # 构造符合原方法逻辑的Mock响应对象 mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = {'access_token': mock_access_token} mock_post.return_value = mock_response # 调用原方法 result_token = _obj.get_access_token() # 断言返回的token值正确 self.assertEqual(result_token, mock_access_token) # 可选:验证requests.post是否按预期参数调用 mock_post.assert_called_once_with( "https://www.my-website.com/login/", json={'name': 'test_user', 'password': 'test_pass'}, headers={ 'Authorization': 'Bearer ', 'Content-Type': 'application/json', 'Accept': 'application/json' }, verify=False ) if __name__ == "__main__": unittest.main()
内容的提问来源于stack exchange,提问作者SHM
相关产品推荐
相关产品推荐

