Go 为单元测试更改结构字段
我正在尝试对具有多个字段的结构的构造函数进行单元测试。我希望确保构造函数执行所有预期的验证,因此我正在测试多个故障场景的单个字段 我试图通过编程的方式来实现这一点,所以我使用了表测试,但是这导致了测试中的大量重复和噪音,因为我最终重复N个param字段只是为了测试一个字段的错误 例如:Go 为单元测试更改结构字段,go,Go,我正在尝试对具有多个字段的结构的构造函数进行单元测试。我希望确保构造函数执行所有预期的验证,因此我正在测试多个故障场景的单个字段 我试图通过编程的方式来实现这一点,所以我使用了表测试,但是这导致了测试中的大量重复和噪音,因为我最终重复N个param字段只是为了测试一个字段的错误 例如: func NewSomeObject(p *Params) *SomeObject { ... } type SomeObject struct { .. Field1 string Fiel
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)
}
}
}
func NewSomeObject(p*Params)*SomeObject{
...
}
键入SomeObject结构{
..
字段1字符串
字段2字符串
字段3字符串
...
字段10字符串
}
func TestNewSomeObject(t*testing.t){
tcases:=映射[字符串]结构{
参数*参数
错误
}{
&Params{
字段1:“无效的_0”/您可以通过创建一个构造函数来设置所有默认值(有效),从而避免重复代码
构造函数还可以接收一个函数,在返回创建的对象之前对其进行操作
这样,您只需要编写使要测试的特定字段无效所需的逻辑
要创建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
}
这里的完整工作代码:为参数编写一个构造函数/函数,它只接受字段1作为输入并设置参数。感谢您的评论。我想对每个字段都这样做,而不仅仅是字段1…所以我想我需要某种闭包?我不希望我的测试也以太多逻辑结束。如果结构的零值是valid(这在Go中是惯用的),那么您只需要设置您正在测试无效值的一个字段。