面试题答案
一键面试1. 示例场景
假设我们有一个Python函数 get_user_info
,它调用外部RESTful API获取用户信息。外部API地址为 https://example.com/api/user/{user_id}
,返回格式为JSON,包含用户姓名和年龄。现在我们要在外部API不稳定或未完成开发时,使用 unittest.mock
库模拟其响应进行测试。
2. 实现代码
import unittest
from unittest.mock import patch
import requests
def get_user_info(user_id):
url = f"https://example.com/api/user/{user_id}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
return None
class TestGetUserInfo(unittest.TestCase):
@patch('requests.get')
def test_get_user_info(self, mock_get):
mock_response = unittest.mock.Mock()
mock_response.status_code = 200
mock_response.json.return_value = {'name': 'John', 'age': 30}
mock_get.return_value = mock_response
result = get_user_info(1)
self.assertEqual(result, {'name': 'John', 'age': 30})
if __name__ == '__main__':
unittest.main()
在上述代码中:
@patch('requests.get')
用于替换requests.get
函数,这样在测试时不会真的发起HTTP请求。- 创建
mock_response
模拟响应对象,设置其status_code
和json
方法的返回值。 - 将
mock_get
的返回值设为mock_response
,这样在调用get_user_info
时,requests.get
返回的就是我们模拟的响应。 - 最后断言
get_user_info
的返回结果与预期的模拟数据一致。