Передача тестовых данных во вложенную структуру

# #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:порт }(struct { Port string }{Port: "d"})' (type struct {...}) as the type struct {...}

Ответ №1:

При создании значения структуры следует указать структуру.

 {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
}
 

а затем обратитесь к нему при инициализации значения структуры

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

Комментарии:

1. Спасибо! Да, это сработало! В идеале я бы использовал две структуры, но в моем реальном сценарии я получаю данные откуда-то, над чем у меня нет контроля

2. Я продвинулся здесь дальше и задался вопросом, есть ли способ не указывать все поля в моих тестовых примерах (я обновил свой вопрос, чтобы отразить это)?

3. Я не уверен, понял ли я ваш обновленный вопрос. Но если бы ваш вопрос заключался в том , можно ли это сделать без обновления исходной структуры ConformanceChange , вы могли бы определить другой тип структуры внутри (или снаружи) тестовой функции и использовать ее вместо этого. Пока поля структуры совпадают, вам не нужно будет обновлять исходную структуру. Вот ссылка на игровую площадку — play.golang.org/p/k8UAgBA2C88 .