我正在编写测试,并且能够使用 go-sqlmock 模拟用于 sql 查询的数据库。但是怎么测试handlers,也就是我想不到的headers。这是一个例子:
func (env *EnvironmentUser) GetUserHandler (w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, err := strconv.Atoi(params["id"])
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}
user, err := env.Db.GetUser(int(id))
if err != nil {
if err == sql.ErrNoRows {
w.WriteHeader(http.StatusUnauthorized)
}
w.WriteHeader(http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(user)
w.WriteHeader(http.StatusOK)
}
GetUser - 列表:
row := db.QueryRow("SELECT * FROM users WHERE id = $1", id)
err = row.Scan(&user.Id, &user.Email, &user.Login, &user.Fullname,
&user.Password, &user.AccVerified)
if err != nil {
return models.User{}, err
}
return user, nil
如何检查所有haders的正确性?
最佳答案
您的问题应该是 如何调用处理程序并记录响应 ,根据 httptest 中的示例,您可以使用 testify 执行以下操作
req, err := http.NewRequest(...)
rec := httptest.NewRecorder()
env.GetUserHandler(rec, req)
require.Equal(t, http.StatusOK, rec.Code)
require.Equal(t, "...", rec.Header().Get("..."))
编辑
如果您更喜欢仅使用 stdlib,则最后两行变为
if http.StatusOK != rec.Code {
t.Errorf(...)
}
if "..." != rec.Header().Get("...") {
t.Errorf(...)
}
关于database - 如何在测试中模拟数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550184/