为了账号安全,请及时绑定邮箱和手机立即绑定

在测试多路复用器中。Vars() 返回 nil 而不是预期的 map

在测试多路复用器中。Vars() 返回 nil 而不是预期的 map

Go
POPMUISE 2022-08-09 16:44:40
我在一个函数中设置了一个大猩猩多路复用路由器,该函数返回,如下所示*mux.Routerfunc MakeApp(services service.Service, pe PolicyEnforce) *mux.Router {    app := mux.NewRouter()    app.NotFoundHandler = &NotFound{}    app.Use(token.TokenMiddleware)    # ...        app.Methods(http.MethodPost).Path("/api/v1/subscription/{emisor}/mh").HandlerFunc(MakeUpdateMH(services, pe))    app.Methods(http.MethodGet).Path("/api/v1/subscription/{emisor}/mh").HandlerFunc(MakeGetMH(services, pe))    app.Methods(http.MethodPost).Path("/api/v1/subscription").HandlerFunc(MakeCreateSubscription(services, pe))    app.Methods(http.MethodGet).Path("/api/v1/subscription/{emisor}").HandlerFunc(MakeGetSubscription(services, pe))        # ...    return app}因此,在我的测试中,我准备了带有URL的句柄并运行它:func (suite *AppTestSuite) TestUpdateMH() {    args := &service.UpdateMHInput{        Usuario:     new(string),        Clave:       new(string),        Pin:         new(string),        Certificado: new(string),        Actividades: []string{},    }    reader, err := makeBody(args)    suite.NoError(err)    handle := token.TokenMiddleware(transport.MakeUpdateMH(suite._s, suite.pe))    req := httptest.NewRequest(http.MethodPut, "/api/v1/subscription/-/mh", reader)    w := httptest.NewRecorder()    t := genToken([]v43.Rol{        {            Nombre: "mh",            Permisos: []v43.Permiso{{                Sujeto: permission.MHCredentials,                Accion: permission.Update,            }},        },    })    req.Header.Add("Authorization", t)    // configura repository    suite.r.On("UpdateIssuerMH", emisor, args.Usuario, args.Clave, args.Pin, args.Certificado, args.Actividades).Return(v43.Grupo{}, nil)    handle.ServeHTTP(w, req)    resp := w.Result()    suite.Equal(http.StatusOK, resp.StatusCode, resp.Status)}我注意到返回而不是值映射,它应该包含并且我无法理解为什么情况并非如此。mux.Vars(r)nil{"emisor": "-"}我已经在处理何时为空的情况,但是对于无法使用“-”或空字符串的其他路由器,此怪癖会给我带来麻烦,我做错了什么,我如何仍然可以成功运行测试而不必手动注入我的Vars?以及:这个问题会转化为生产环境吗?"emisor"
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

如果您正在创建一个未路由的请求,但您仍然需要 Vars,则还有另一种选择。


router := mux.NewRouter()


... // setup your routes


var match mux.RouteMatch

success := router.Match(req, &match)

if success {

  id := match.Vars["id"]

  ...

}

这等效于它如何准备变量,只是它实际上并不执行处理程序。该对象还包含有关请求将命中的路由的详细信息。router.ServeHTTP(req, res)match


查看完整回答
反对 回复 2022-08-09
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我的设置是错误的,我没有在我的测试中使用,而是直接调用处理程序。如果我想使用由我的函数返回的,那么我需要使用.*mux.Router*mux.RouterMakeAppnet/http/httptest



查看完整回答
反对 回复 2022-08-09
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号