首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >需要帮助找出中间件测试中无引用错误的原因(Golang)

需要帮助找出中间件测试中无引用错误的原因(Golang)
EN

Stack Overflow用户
提问于 2018-06-03 00:30:04
回答 1查看 91关注 0票数 1

在为http处理程序--特别是身份验证中间件--编写单元测试时,我遇到了“无效的内存地址或nil指针取消引用”错误。

下面是要测试的函数:

代码语言:javascript
复制
func Authenticate(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    var err error
    ck, err := req.Cookie("session")
    if err != nil {
        w.Header().Add("Authorization", "expired/invalid")
        next.ServeHTTP(w, req)
        return
    }

    r, err := env.Db.VerifySession(ck.Value)
    if err != nil {
        http.Error(w, http.StatusText(500), http.StatusInternalServerError)
        return
    }
    if r == "expired/invalid" {
        ck.MaxAge = -1
        http.SetCookie(w, ck)
        w.Header().Add("Authorization", r)
        next.ServeHTTP(w, req)
        return
    }

    w.Header().Add("Authorization", r)
    next.ServeHTTP(w, req)
})
}

抛出错误的特定测试用例:

代码语言:javascript
复制
rec = httptest.NewRecorder()
req, _ = http.NewRequest("GET", "/", nil)
c := &http.Cookie{
    Name:  "session",
    Value: "success",
}
req.AddCookie(c)
routes.Authenticate(http.NotFoundHandler()).ServeHTTP(rec, req)
assert.Equal("admin", rec.Header().Get("Authorization"))

用于测试的env.DB.VerifySession的模拟版本:

代码语言:javascript
复制
func (mdb *mockdb) VerifySession(val string) (string, error) {
switch val {
case "success":
    return "admin", nil
case "failure":
    return "expired/invalid", nil
default:
    return "", errors.New("500")
}
}

我已经为Authenticate()的第一部分编写了一个通过测试:如果没有找到"session“cookie,测试将确认响应头已经被适当地更新。但是,当我传入一个“会话”cookie时,就像上面的测试用例一样,Authenticate()将运行到r, err := env.Db.VerifySession(ck.Value)。尝试在调试模式下单步执行或进入该函数调用会导致抛出nil指针错误。

我不认为问题出在env.Db变量上,因为我已经成功地使用相同的变量在我的非中间件处理程序上运行了一组测试,没有出现任何问题。

我还可以通过调试确认“会话”cookie确实存在。

任何关于这里发生的事情的指导都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-06-03 00:43:40

算了,我知道问题出在哪里了。对于其他路由,我将env变量作为参数传入。我需要找到一种方法来为中间件提供对它的访问。

我想我会将中间件定义为env上的一个方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50658947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档