在Go中测试通过json http响应返回的错误

时间:2019-02-27 13:42:05

标签: go

我目前正在Go中使用图片处理程序,该程序旨在拒绝上传不受支持的文件。我的意图是让Go程序通过服务器http.ResponceWritter返回错误,该错误详细说明了已满足哪种情况(例如json),供上传服务使用。

如何在服务器代码中设置错误:

type Error struct {
    ImgHandlerError `json:"error"`
}

type ImgHandlerError struct {
    Message string `json:"message"`
    Code    string `json:"code"`
}

func MakeError(message, code string) *Error {
    errorMessage := &Error{
        ImgHandlerError: ImgHandlerError{
            Message: message,
            Code:    code,
        },
    }
    return errorMessage
}

func ThrowErr(errorMessage Error, writer http.ResponseWriter) {

    jData, err := json.Marshal(errorMessage)
       if err != nil  {
    }

    writer.Header().Set("Content-Type", "application/json")
    writer.WriteHeader(http.StatusForbidden)
    writer.Write(jData)

    return

}

如何生成错误并将其写为HTTP响应:

errorMes := *MakeError("PSD files are not supported", "DEF-IMG-0006")
ThrowErr(errorMes, res)

当前,这可以按预期工作,例如,当上传.psd时,当前的HTTP响应会以JSON的形式返回。

{"error":{"message":"PSD files are not supported","code":"DEF-IMG-0006"}}

我的问题现在正在测试,因为这是我的第一个Go程序。我正在使用Ginko测试套件。我曾尝试在测试套件中设置http.ResponseRecorder(因为我认为这就是解决方案所在的地方),但是我没有运气。同样,在我当前在测试套件中进行的测试中,仅测试不需要将writer http.ResponseWriter作为参数的函数,因此我不确定是否需要在测试套件中启动服务器以使响应编写器能够读取来自。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

  

我的问题现在正在测试中,因为我无法深入,因为这是我的   第一个Go程序。

因此,您想进行一些端到端测试。在测试文件中,您可以执行以下操作。

req := httptest.NewRequest("POST", "my/v1/endpoint", bytes.NewBuffer(payload))
responseRecorder = httptest.NewRecorder()
router.ServeHTTP(responseRecorder, request)

看看httptest.NewRequesthttptest.ResponseRecorder

基本上,您需要设置路由器,就我个人而言,我使用mux并向其发出请求,就像您是API的真正使用者一样。 请求之后,您的responseRecorder将具有诸如用于读取响应代码的代码和用于读取响应主体的正文之类的字段。

例如

if responseRecorder.Code != 200{
    t.FailNow()
}