在 Gin 处理函数单元测试中模拟 c.BindQuery
单元测试 Go Gin 处理函数通常涉及模拟某些操作来隔离和测试特定的操作场景。其中一个操作是 c.BindQuery,它将请求查询字符串参数绑定到给定的结构。
测试 GetMaterialByFilter 时,由于与无效内存访问或 nil 指针取消引用相关的错误,测试将失败。此错误源于 c.BindQuery 未使用有效的 HTTP 请求正确初始化。
要模拟 c.BindQuery,请创建一个 http.Request 并设置其 URL 和 URL.RawQuery 字段。这允许您模拟处理程序函数将接收的请求:
func mockGin() (*gin.Context, *httptest.ResponseRecorder) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) req := &http.Request{ URL: &url.URL{}, Header: make(http.Header), } testQuery := weldprogs.QueryParam{/* ... */} q := req.URL.Query() for _, s := range testQuery.Basematgroup_id { q.Add("basematgroup_id", s) } req.URL.RawQuery = q.Encode() c.Request = req return c, w }
测试服务调用
处理程序函数还会调用服务方法,services.WeldprogService.GetMaterialByFilter。要测试此调用,服务必须是可注入的,可以通过处理程序函数签名或将其设置为 Gin 上下文值。
如果服务是接口,则可以使用 c.Set 方法注入:
func GetMaterialByFilter(c *gin.Context) { //... weldprogService := mustGetService(c) materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam) // ... } func mustGetService(c *gin.Context) services.WeldprogService { svc, exists := c.Get("svc_context_key") if !exists { panic("service was not set") } return svc.(services.WeldprogService) }
通过实现所需的接口并将其设置为服务上下文来模拟单元测试中的服务value:
type mockSvc struct {} func (mockSvc) GetMaterialByFilter(*weldprogs.QueryParam) (*materialByFilter, error) { /* ... */} func TestGetMaterialByFilter(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Set("svc_context_key", &mockSvc{}) GetMaterialByFilter(c) // ... }
通过执行以下步骤,您可以有效地模拟 c.BindQuery 和服务调用,以隔离并彻底测试您的 Gin 处理程序函数。
以上是如何在 Gin 处理程序功能单元测试中有效模拟 `c.BindQuery` 和服务调用?的详细内容。更多信息请关注PHP中文网其他相关文章!