将测试数据传递给嵌套结构

时间:2021-08-01 22:59:42

标签: go

我正在尝试使用 Go 进行测试,但遇到了一些绊脚石。

我有以下代码:

package main

import (
    "fmt"
    "testing"
)

type ConformanceChange struct {
    Val   string
    Proxy struct {
        Address string
        Port    string
    }
}

func Item(conformance ConformanceChange) string {
    service := conformance.Proxy.Address
    services := map[string]string{
        "Word": "Now",
    }
    service = services[service]
    fmt.Println("Service: ", service)
    return service
}

func Test_Item(t *testing.T) {
    type args struct {
        conformance ConformanceChange
    }
    tests := []struct {
        name string
        args args
        want string
    }{
        // TODO: Add test cases.
        {name: "empty", args: args{
            conformance: ConformanceChange{},
        }, want: ""},
        {name: "value", args: args{
            conformance: ConformanceChange{Val: "test", Proxy: {Address: "d", Port: "d"}},
        }, want: ""},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := Item(tt.args.conformance); got != tt.want {
                t.Errorf("getService() = %v, want %v", got, tt.want)
            }
        })
    }
}

我希望能够在运行测试时将数据传递给 ConformanceChange.Proxy.Address。我可以将数据传递给 ConformanceChange.Val 并且它可以工作。

有人可以告诉我正确的语法吗?

更新 Bless 提供的解决方案奏效了。

接下来,如果我有以下代码:

package main

import (
    "fmt"
    "testing"
)

type ConformanceChange struct {
    Val   string
    Proxy struct {
        Address string `json:address`
        Port    string `json:port`
    }
}

func Item(conformance ConformanceChange) string {
    service := conformance.Proxy.Address
    services := map[string]string{
        "Word": "Now",
    }
    service = services[service]
    fmt.Println("Service: ", service)
    return service
}

func Test_Item(t *testing.T) {
    type args struct {
        conformance ConformanceChange
    }
    tests := []struct {
        name string
        args args
        want string
    }{
        // TODO: Add test cases.
        {name: "empty", args: args{
            conformance: ConformanceChange{},
        }, want: ""},
        {name: "value", args: args{
            conformance: ConformanceChange{Val: "test", Proxy: struct {
                Port    string `json:port`
            }(struct {
                Port    string
            }{Port: "d"})},
        }, want: ""},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := Item(tt.args.conformance); got != tt.want {
                t.Errorf("getService() = %v, want %v", got, tt.want)
            }
        })
    }
}

我不想在我的测试中指定所有字段(因为它可能会变得混乱),我可以只指定一个吗?在上面的代码中,它失败了: Cannot use 'struct { Port string json:port }(struct { Port string }{Port: "d"})' (type struct {...}) as the type struct {...}

1 个答案:

答案 0 :(得分:2)

创建结构体值时,应指定结构体。

{name: "value", args: args{
    conformance: ConformanceChange{Val: "test", Proxy: struct{Address string; Port string}{Address: "d", Port: "d"}},
}, want: ""},

为避免重复,您可以定义一个 Proxy 结构

type Proxy struct {
    Address string
    Port    string
}

type ConformanceChange struct {
    Val   string
    Proxy Proxy
}

然后在初始化struct值时引用它

{name: "value", args: args{
    conformance: ConformanceChange{Val: "test", Proxy: Proxy{Address: "d", Port: "d"}},
}, want: ""},