Golang单元测试是保证代码质量和功能正确性的重要手段,但在实践中,我们常常会遇到一些简单的错误问题。在本文中,php小编子墨将为大家介绍一些常见的错误问题,以及如何解决它们。通过学习这些问题的解决方法,相信大家在进行Golang单元测试时能够更加顺利地进行,提高代码的质量和可靠性。
我在尝试测试此函数时遇到问题,但内部有错误。以下是我的 responsejson 函数,它不返回错误,但发送响应 json。
func responsejson(w http.responsewriter, code int, message string) { jsonstatus := struct { code int `json:"code"` message string `json:"message"` }{ message: message, code: code, } bs, err := json.marshal(jsonstatus); if err != nil { log.println("error in marshal json in responsejson: ", err) str := "internal server error. please contact the system administrator." io.writestring(w, str); return } else { io.writestring(w, string(bs)); return } }
以下是我的单元测试代码,它创建了一个模拟 responsewriter,它能够成功测试编写器响应 json 的情况,没有错误。由于我没有在 responsejson() 函数中返回错误类型,因此如何在 test_responsejson 函数中测试它,如下所示?
func test_responsejson(t *testing.t) { responsejsontests := []struct { testname string code int message string expectedjsonresponse string } { {"successful login", http.statusok, "successfully logged in!", `{"code":200,"message":"successfully logged in!"}`}, {"existing username", http.statusbadrequest, "username already exists. please try again.", `{"code":400,"message":"username already exists. please try again."}`}, } for _, e := range responsejsontests { // creating a mock responsewriter w := httptest.newrecorder() responsejson(w, e.code, e.message) // read the response body as a string body, _ := io.readall(w.result().body) actual := string(body) expected := e.expectedjsonresponse if actual != expected { t.errorf("%s: expected %s but got %s", e.testname, e.expectedjsonresponse, actual) } } }
此外,我还创建了一个函数,它为 log.println() 内置函数生成实际的日志输出。我知道 log.println() 函数是一个内置函数,它不太可能失败。但是,我希望在单元测试中实现 100% 的覆盖率。请帮忙!谢谢:)
func GenerateLogOutput(message string, errorMessage string) string { // Create a new bytes.Buffer to capture the log output var buf bytes.Buffer // Redirect log output to a different destination set as a buffer // By default, log message are written to the standard error stream os.Stderr log.SetOutput(&buf) // Generate an error err := errors.New(errorMessage) w := httptest.NewRecorder() // Calling the function InternalServerError(w, message, err) actualOutput := buf.String() return actualOutput }
简单地说,我们可以为 responsejson
函数编写一个测试用例,如下所示。
func Test_ResponseJson(t *testing.T) { tests := []struct { Code int Message string ExpectedStr string }{ { Code: 1, Message: "sample message", ExpectedStr: "{\"code\":1,\"message\":\"sample message\"}", }, } for _, test := range tests { w := httptest.NewRecorder() ResponseJson(w, test.Code, test.Message) res := w.Result() data, err := ioutil.ReadAll(res.Body) res.Body.Close() actualStr := string(data) assert.Nil(t, err, "Invalid test data") assert.Equal(t, actualStr, test.ExpectedStr) } }
我们无法从 bs 获取错误,err := json.marshal(jsonstatus)
。 json.marshal
函数可以返回两种类型的错误。
unsupportedtypeerror
(例如:通道、复合值和函数值)unsupportedvalueerror
(例如:循环数据结构)我们无法解析值来生成上述错误之一。我们正在解析具有支持的值和支持的类型的结构。因此,我们无法编写 100% 覆盖率的测试。
以上是Golang 单元测试的简单错误问题的详细内容。更多信息请关注PHP中文网其他相关文章!