登录
首页 >  Golang >  Go问答

有没有一种好方法可以更新传递给 Golang 子测试的结构

来源:stackoverflow

时间:2024-04-14 08:30:33 333浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《有没有一种好方法可以更新传递给 Golang 子测试的结构》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我正在尝试编写一个表驱动的测试来测试,例如,传递给函数的两个订单是否相同,

其中 order 可以是这样的

type order struct {
    orderid string
    ordertype string
}

现在,我的测试如下:

func testcheckifsameorder(t *testing.t) {
    currorder := order{
         orderid: "1",
         ordertype: "sale"
    }
    oldorder := order{
         orderid: "1",
         ordertype: "sale"
    }
    tests := []struct {
        name string
        curr order
        old  order
        want bool
    }{
        {
            name: "same",
            curr: currorder,
            old:  oldorder,
            want: true,
        },
    }
    for _, tt := range tests {
        t.run(tt.name, func(t *testing.t) {
            got := checkifsameorder(tt.curr, tt.old)
            if got != tt.want {
                t.errorf("want %v: got %v", tt.want, got)
            }
        })
    }

}

func checkifsameorder(currorder order, oldorder order) bool {
    if currorder.orderid != oldorder.orderid {
        return false
    }
    if currorder.ordertype != oldorder.ordertype {
        return false
    }
    return true
}

我想做的是添加第二个测试,在其中更改 currorder 上的 orderid 或其他内容,以便我的测试切片看起来像

tests := []struct {
        name string
        curr Order
        old  Order
        want bool
    }{
        {
            name: "Same",
            curr: currOrder,
            old:  oldOrder,
            want: true,
        },
        {
            name: "Different OrderId",
            curr: currOrder, <-- where this is the original currOrder with changed OrderId
            old:  oldOrder,
            want: false,
        },
    }

在我看来,我无法使用简单的 []struct 并在传递函数的地方使用某些东西,但我似乎无法在任何地方找到如何做到这一点。如果有人能指出我正确的方向,我将不胜感激。谢谢!


解决方案


如果每次测试中只有 orderid 不同,您可以只传递订单 id 并基于该内部循环构造 oldorder 和 currorder。
在整个进程中共享改变的全局变量一直会引起混乱。更好地为每个测试初始化​​新变量。

func TestCheckIfSameOrder(t *testing.T) {

    tests := []struct {
        name string
        currId string
        oldId  string
        want bool
    }{
        {
            name: "Same",
            currId: "1",
            oldId:  "1",
            want: true,
        },
        {
            name: "Different",
            currId: "1",
            oldId:  "2",
            want: true,
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            curr := Order{
                OrderId: tt.currId,
                OrderType: "SALE"
            }
            old := Order{
                OrderId: tt.oldId,
                OrderType: "SALE"
            }

            got := checkIfSameOrder(curr, old)
            if got != tt.want {
                t.Errorf("want %v: got %v", tt.want, got)
            }
        })
    }
}

到这里,我们也就讲完了《有没有一种好方法可以更新传递给 Golang 子测试的结构》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>