首页 > 后端开发 > Golang > 如何使用数据绑定和服务依赖性有效地对 Go Gin 处理程序功能进行单元测试?

如何使用数据绑定和服务依赖性有效地对 Go Gin 处理程序功能进行单元测试?

Susan Sarandon
发布: 2024-12-29 20:36:11
原创
646 人浏览过

How to Effectively Unit Test Go Gin Handler Functions with Data Binding and Service Dependencies?

如何使用请求数据绑定对 Go Gin 处理程序函数进行单元测试

在单元测试 Gin 处理程序函数中,正确初始化和设置请求正文和查询参数至关重要。让我们深入研究如何有效地测试 c.BindQuery。

在提供的测试代码中,c.BindQuery 不起作用,因为 HTTP 请求未使用任何查询参数进行初始化。要模拟 c.BindQuery,您需要创建一个测试请求并相应地设置其 URL 和 URL.RawQuery。这是一个改进的版本:

func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Create a test request with query parameters
    req := &http.Request{
        URL:    &url.URL{},
        Header: make(http.Header),
    }
    testQuery := weldprogs.QueryParam{/* init fields */}
    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
}
登录后复制

模拟查询绑定后,您可以在处理函数 GetMaterialByFilter 中测试 c.BindQuery。

测试服务依赖关系

您的处理函数也会调用该服务services.WeldprogService.GetMaterialByFilter。要使此调用可测试,该服务应该是一个可以作为处理程序的依赖项注入的接口。

以下是执行此操作的方法:

// Define an interface for your service
type WeldprogService interface {
    GetMaterialByFilter(query *weldprogs.QueryParam) ([]weldprogs.Material, error)
}

// Inject the service into your handler as a context value
func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

func mustGetService(c *gin.Context) WeldprogService {
    svc, exists := c.Get("svc_context_key")
    if !exists {
        panic("service was not set")
    }
    return svc.(WeldprogService)
}
登录后复制

现在,您可以模拟单元测试中的服务并控制其行为:

type mockSvc struct {
}

// Implement the WeldprogService interface on mockSvc

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Set the mock service into the test context
    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}
登录后复制

以上是如何使用数据绑定和服务依赖性有效地对 Go Gin 处理程序功能进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

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