gpt4 book ai didi

go - 改变单元测试的结构字段

转载 作者:IT王子 更新时间:2023-10-29 01:41:31 25 4
gpt4 key购买 nike

我正在尝试对具有多个字段的结构的构造函数进行单元测试。我想确保构造函数执行所有预期的验证,因此我正在针对多个失败场景测试单个字段。

我正在尝试以编程方式执行此操作,因此我正在使用表测试,但这会导致测试中出现大量重复和噪音,因为我最终重复 N 个参数字段只是为了测试一个字段错误。

例如:

func NewSomeObject(p *Params) *SomeObject {
...
}


type SomeObject struct {
..
Field1 string
Field2 string
Field3 string
...
Field10 string
}

func TestNewSomeObject(t *testing.T) {
tcases := map[string]struct {
params *Params
err error
}{
&Params{
Field1: "invalid_0" // <--- making sure that this invalid field is caught
Field2: "valid"
Field3: "valid"
...
Field10: "valid"
},
&Params{
Field1: "invalid_1" // <--- another invalid case
Field2: "valid"
Field3: "valid"
...
Field10: "valid"
},
&Params{
Field1: "invalid_2"
Field2: "valid"
Field3: "valid"
...
Field10: "valid"
},
&Params{
Field1: "invalid_3"
Field2: "valid"
Field3: "valid"
...
Field10: "valid"
},
...
...
...
}

for name, tc := range tcases {
t.Logf("Running test %s", name)

s, err := NewSomeObject(tc.params)
if !reflect.DeepEqual(tc.err, err) {
t.Fatalf("Got '%v', Expected: '%v'", err, tc.err)
}
}
}

有没有更好的方法来改变结构中的单个字段而不必多次重复输入?

最佳答案

您可以通过创建一个构造函数来设置所有默认值(有效),从而避免重复代码。

构造函数还可以接收一个函数,在返回之前对创建的对象进行操作。

这样,您只需编写使要测试的特定字段无效所需的逻辑。

要创建一个 Params 对象,您可以这样做:

params1 := CreateParamsWith(func(p *Params) {
p.Field1 = "invalid_0"
})

CreateParamsWith 可能如下所示:

func CreateParamsWith(modifyParams func(*Params)) (*Params) {
params := &Params{
Field1: "valid",
Field2: "valid",
Field3: "valid",
Field4: "valid",
Field5: "valid",
}
modifyParams(params)
return params
}

完整的工作代码在这里:https://play.golang.org/p/U0xhtIbQfy

关于go - 改变单元测试的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44118967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com