database - 如何在测试中模拟数据库

标签 database go mocking

我正在编写测试,并且能够使用 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/

相关文章:

go - 如何在 Go 中包含来自第三方包的 header ?

go - Git url映射到自定义域

go - 在 Golang 中将字符串通过管道传输到命令的 STDIN

c# - 模拟副作用

ruby-on-rails-3 - 使用 RSpec 将参数传递给 Rails Controller 操作中的模拟模型方法的问题

sql - ORACLE 根据两列查找计数

database - 在数据库列中存储分隔列表真的那么糟糕吗?

mysql - 数据库结构

database - Ora 12154 错误

python - 类型错误 : unbound method when trying to mock a classmethod