You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在测试中正确断言http.client.HTTPSConnection.request的调用?

问题分析与修正方案

你的测试代码存在两个核心错误:

  1. Mock时机错误:你先调用了glab_requests.create_project(connection),之后才patchHTTPSConnection.request——这时候真实的请求已经执行了,Mock根本没起到拦截作用。
  2. 断言对象错误: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格式校验逻辑时,可以单独写一个测试用例,mockos.getenv返回非法格式的token,断言GlabRequestException被抛出。
  • 所有外部依赖(环境变量、文件系统、网络请求)都应该在测试中Mock,保证测试的独立性和可重复性。

内容的提问来源于stack exchange,提问作者wavesinaroom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:28:20