【问题标题】:Server returning 400 when user exists用户存在时服务器返回 400
【发布时间】:2019-07-10 00:07:37
【问题描述】:

我正在用 Go 进行一些测试,过去 2 天我一直在尝试让它工作,但我做不到。我的问题是即使用户确实存在,测试也会返回 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)
}

这是我的用户处理程序

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)
    }
}

【问题讨论】:

  • 尝试使用net/http/httptest 来测试您的服务器,这就是它的用途。 example
  • @mkopriva:问题在代码 sn-ps 之一中提到了 httptest
  • @EliBendersky 我的错,我完全忽略了这一点,尽管我的意思是使用 httptest.Server 而不是“裸”多路复用器。
  • 什么是响应正文?看起来您响应 400 的唯一地方是如果 Atoi 失败,并且您在正文中包含一些有用的信息,但您没有在测试中记录它。
  • @Adrian 你是对的。问题来自Atoi 函数。由于某种原因,它每次都失败。知道为什么会这样吗?我以前从未见过Atoi 失败过。我查看了传递给它的内容,它是"10"

标签: http go testing


【解决方案1】:

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

让您的服务器代码具有完整的功能并具有有效的逻辑。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多