首页 > 后端开发 > Golang > 如何在 Gin 处理程序功能单元测试中有效模拟 `c.BindQuery` 和服务调用?

如何在 Gin 处理程序功能单元测试中有效模拟 `c.BindQuery` 和服务调用?

Susan Sarandon
发布: 2024-12-29 08:53:10
原创
868 人浏览过

How to Effectively Mock `c.BindQuery` and Service Calls in Gin Handler Function Unit Tests?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板