4 回答
TA贡献1810条经验 获得超4个赞
有一个类似的问题,虽然我直接对处理程序进行单元测试。httptest.NewRequest基本上,当使用强制您手动添加时,url 参数似乎不会自动添加到请求上下文中。
以下内容对我有用。
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/{key}", nil)
rctx := chi.NewRouteContext()
rctx.URLParams.Add("key", "value")
r = r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, rctx))
handler := func(w http.ResponseWriter, r *http.Request) {
value := chi.URLParam(r, "key")
}
handler(w, r)
全部归功于soedar =)
TA贡献1831条经验 获得超10个赞
现在可能迟到了 :) 但也许其他人会发现它有用。
我遇到了同样的问题,并希望将我的测试结构化为一个片段,所以我最终创建了一个“帮助程序”函数,以便向请求添加所需的 chi 上下文:
func AddChiURLParams(r *http.Request, params map[string]string) *http.Request {
ctx := chi.NewRouteContext()
for k, v := range params {
ctx.URLParams.Add(k, v)
}
return r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, ctx))
}
同样,正如@Ullauri 所提到的,解决方案的所有功劳都归功于soedar。
但是有了这个函数,你就可以像这样在切片中很好地使用它:
{
name: "OK_100",
rec: httptest.NewRecorder(),
req: AddChiURLParams(httptest.NewRequest("GET", "/articles/100", nil), map[string]string{
"id": "100",
}),
expectedBody: `article ID:100`,
},
希望这可以帮助!:)
TA贡献2037条经验 获得超6个赞
在您指导定义 path 之后main
的用法,但在您的测试中您只是直接使用。ArticleCtx
/articles
ArticleCtx
您的测试请求不应包含/articles
,例如:
httptest.NewRequest("GET", "/1", nil)
- 4 回答
- 0 关注
- 164 浏览
添加回答
举报