如何在测试中正确断言http.client.HTTPSConnection.request的调用?
问题分析与修正方案
你的测试代码存在两个核心错误:
- Mock时机错误:你先调用了
glab_requests.create_project(connection),之后才patchHTTPSConnection.request——这时候真实的请求已经执行了,Mock根本没起到拦截作用。 - 断言对象错误:
HTTPSConnection.request的调用参数不是urllib.request.Request对象,而是单独的method、url、headers等参数,你用Request对象去断言完全不匹配。
正确的测试写法
def test_project_creation(self): # 1. Mock依赖的环境变量和路径,避免依赖真实环境 with patch("os.getenv") as mock_getenv, \ patch("pathlib.Path.cwd") as mock_cwd, \ patch("http.client.HTTPSConnection.request") as mock_request: # 设置mock返回值 mock_getenv.return_value = "valid-token-123" mock_cwd.return_value.name = "test-project-name" # 2. 创建连接对象(此时request方法已经被mock) connection = http.client.HTTPSConnection("gitlab.com") # 3. 调用待测试函数 glab_requests.create_project(connection) # 4. 断言request方法的调用参数 expected_headers = { "PRIVATE-TOKEN": "valid-token-123", "name": "test-project-name" } mock_request.assert_called_once_with( "POST", "/api/v4/projects", headers=expected_headers )
额外优化建议
- 测试token格式校验逻辑时,可以单独写一个测试用例,mock
os.getenv返回非法格式的token,断言GlabRequestException被抛出。 - 所有外部依赖(环境变量、文件系统、网络请求)都应该在测试中Mock,保证测试的独立性和可重复性。
内容的提问来源于stack exchange,提问作者wavesinaroom
相关产品推荐
相关产品推荐

