相关疑难解决方法(0)

使用覆盖率信息测试Go中的os.Exit场景(coveralls.io/Goveralls)

这个问题:如何测试Go中的os.exit场景(以及其中最高的投票答案),阐述了如何os.Exit()在go中测试场景.由于os.Exit()不能轻易拦截,使用的方法是重新调用二进制文件并检查退出值.这个方法在Andrew Gerrand(Go团队的核心成员之一)的演示文稿第23页中描述; 代码非常简单,下面将全文转载.

相关的测试和主文件看起来像这样(请注意,这对文件本身就是一个MVCE):

package foo

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher() // This causes os.Exit(1) to be called
        return
    }
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        fmt.Printf("Error is %v\n", e)
    return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
Run Code Online (Sandbox Code Playgroud)

package …
Run Code Online (Sandbox Code Playgroud)

architecture testing unit-testing go coveralls

13
推荐指数
2
解决办法
3157
查看次数

如何为 BindJSON 设置模拟 gin.Context

我正在设置测试Go

我用go-sqlmockGo Gin 作为框架来测试 mysql 连接。现在我尝试测试mysql插入逻辑。

问题是我需要设置稍后gin.Context使用的模拟BindJSON。但到目前为止
我还不能设置这个。gin.Context

server side: golang
db: mysql
web framework: gin
Run Code Online (Sandbox Code Playgroud)

道戈

server side: golang
db: mysql
web framework: gin
Run Code Online (Sandbox Code Playgroud)

dao_test.go

unc PostImageToDBDao(c *gin.Context, db *sql.DB) {
        // Because of this logic, I need to set gin.Context with json
    var imageData util.ImageData
    c.BindJSON(&imageData)

    for _, imageName := range imageData.IMAGENAMES {
        ins, err := db.Prepare("INSERT INTO images(article_uuid, image_name) VALUES(?,?)")
        if err != nil {
            log.Fatal(err)
        }
        ins.Exec(imageData.ARTICLEUUID, …
Run Code Online (Sandbox Code Playgroud)

unit-testing go go-gin go-sqlmock

13
推荐指数
1
解决办法
7090
查看次数

如何对 Go Gin 处理函数进行单元测试?

我有一个这样的控制器功能......

func GetMaterialByFilter(c *gin.Context) {

    queryParam := weldprogs.QueryParam{}
    c.BindQuery(&queryParam)
    materialByFilter, getErr := services.WeldprogService.GetMaterialByFilter(&queryParam)
    if getErr != nil {
        //TODO : Handle user creation error
        c.JSON(getErr.Status, getErr)
        return
    }
    c.JSON(http.StatusOK, materialByFilter)

}
Run Code Online (Sandbox Code Playgroud)

QueryParam 结构是这样的..

type QueryParam struct {
    Basematgroup_id []string `form:"basematgroup_id"`
    License_id      []string `form:"license_id"`
    Diameter_id     []string `form:"diameter_id"`
    Gasgroup_id     []string `form:"gasgroup_id"`
    Wiregroup_id    []string `form:"wiregroup_id"`
    Wiremat_id      []string `form:"wiremat_id"`
}
Run Code Online (Sandbox Code Playgroud)

我的测试功能是这样的..

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

    var got gin.H
    err := json.Unmarshal(w.Body.Bytes(), &got)
    if …
Run Code Online (Sandbox Code Playgroud)

integration-testing unit-testing go go-gin

12
推荐指数
1
解决办法
1万
查看次数