# #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 .