用户存在时服务器返回400

时间:2019-02-15 19:57:43

标签: http go testing

我正在Go上进行一些测试,过去两天我一直在努力使其运行,但我做不到。我的问题是,即使用户确实存在,测试也会返回400。

这是我的getUser函数

func (handler *UserHandler) getUser(w http.ResponseWriter, ID int) {
    logfile, err := os.OpenFile("events.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("Error opening file: %v", err)
    }
    defer logfile.Close()
    log.SetOutput(logfile)

    user := db.Fetch(ID)

    userJSON, err := json.Marshal(user)
    if err != nil {
        log.Printf("Error while marshaling the user into JSON: %v", err)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)

    // userJSON is sent as http Response
    w.Write(userJSON)
}

这是我的UserHandler

type UserHandler struct{}

func (handle *UserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var head string
    head, r.URL.Path = ShiftPath(r.URL.Path)
    id, err := strconv.Atoi(head)
    if err != nil {
        http.Error(w, fmt.Sprintf("Invalid user ID %q", head), http.StatusBadRequest)
        return
    }
    switch r.Method {
    case "GET":
        handle.getUser(w, id)
    default:
        http.Error(w, "Only GET is allowed", http.StatusMethodNotAllowed)
    }
}

func ShiftPath(p string) (head, tail string) {
    p = path.Clean("/" + p)
    i := strings.Index(p[1:], "/") + 1
    if i <= 0 {
        return p[1:], "/"
    }
    return p[1:i], p[i:]
}

这是我的考验

func TestGetUser(t *testing.T) {
    handler := new(UserHandler)
    mux := http.NewServeMux()
    mux.HandleFunc("/user/", handler.ServeHTTP)

    writer := httptest.NewRecorder()
    request, _ := http.NewRequest("GET", "/user/12", nil)
    mux.ServeHTTP(writer, request)

    if writer.Code != 200 {
        t.Errorf("Response code is %v", writer.Code)
    }
}

1 个答案:

答案 0 :(得分:0)

具有代码====> id,err的问题:= strconv.Atoi(head) 由于错误,您会看到退货,因此会看到400错误。

使服务器代码具有有效逻辑的全部功能。

建议:始终逐行打印或调试。您可以找到问题和根本原因。