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

如何为无返回错误的Golang ResponseJson函数编写错误分支测试?

测试无返回error的ResponseJson函数的序列化错误分支

要覆盖json.Marshal失败的分支,核心思路就是构造一个无法被JSON序列化的输入,再结合你已经实现的日志捕获函数验证错误行为,同时检查响应输出是否符合预期。

步骤1:构造不可序列化的测试对象

Go里可控的不可序列化场景,推荐用自定义实现json.Marshaler接口但返回错误的类型:

// 定义一个会序列化失败的类型
type badMarshaler struct{}

func (b badMarshaler) MarshalJSON() ([]byte, error) {
    return nil, fmt.Errorf("模拟JSON序列化失败")
}

步骤2:编写测试用例

在Test_ResponseJson里新增测试分支,用httptest.ResponseRecorder模拟响应Writer,结合你的GenerateLogOutput捕获日志,验证错误分支的行为:

func Test_ResponseJson(t *testing.T) {
    // 正常分支测试(你已实现的部分)
    t.Run("正常序列化", func(t *testing.T) {
        // ... 你的原有测试代码
    })

    // 新增序列化失败分支测试
    t.Run("序列化失败", func(t *testing.T) {
        // 模拟HTTP响应Writer
        w := httptest.NewRecorder()
        // 使用不可序列化的测试对象
        badData := badMarshaler{}

        // 捕获log输出
        logOutput := GenerateLogOutput(func() {
            ResponseJson(w, badData)
        })

        // 验证日志是否包含预期错误信息
        if !strings.Contains(logOutput, "JSON序列化失败") {
            t.Errorf("期望日志包含序列化错误,实际输出:%s", logOutput)
        }

        // 验证响应状态码(根据你的函数设计调整,比如500)
        if w.Code != http.StatusInternalServerError {
            t.Errorf("期望状态码500,实际:%d", w.Code)
        }

        // 验证响应内容(如果你的函数出错时返回空或特定内容,按需调整)
        if w.Body.String() != "" {
            t.Errorf("期望响应为空,实际:%s", w.Body.String())
        }
    })
}

关键说明

  • 如果原函数在json.Marshal失败时会返回特定响应内容(比如错误提示JSON),要对应调整响应内容的验证逻辑。
  • httptest.ResponseRecorder可以完整捕获函数对HTTP响应的所有操作,确保错误分支的响应行为符合设计。
  • 确保你的GenerateLogOutput能匹配原函数使用的日志方法(比如原函数用log.Printf的话,捕获逻辑要对应调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:15:05