Go 为单元测试更改结构字段

Go 为单元测试更改结构字段,go,Go,我正在尝试对具有多个字段的结构的构造函数进行单元测试。我希望确保构造函数执行所有预期的验证,因此我正在测试多个故障场景的单个字段 我试图通过编程的方式来实现这一点,所以我使用了表测试,但是这导致了测试中的大量重复和噪音,因为我最终重复N个param字段只是为了测试一个字段的错误 例如: func NewSomeObject(p *Params) *SomeObject { ... } type SomeObject struct { .. Field1 string Fiel

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

我试图通过编程的方式来实现这一点,所以我使用了表测试,但是这导致了测试中的大量重复和噪音,因为我最终重复N个param字段只是为了测试一个字段的错误

例如:

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中是惯用的),那么您只需要设置您正在测试无效值的一个字段。