【发布时间】: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"