#go #testing
#Вперед #тестирование
Вопрос:
Учитывая следующий код: я пытаюсь сохранить тип клиента mongo в структуре для последующего сравнения.
func TestGetMongoClient(t *testing.T) {
type args struct {
opts *Options
}
tests := []struct {
name string
args args
want *mongo.Client
wantErr bool
}{
{name: "Mongo Client Creation", args: args{opts: amp;opts}, want: , wantErr: nil},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := GetMongoClient(tt.args.opts)
if (err != nil) != tt.wantErr {
t.Errorf("GetMongoClient() error = %v, wantErr %v", err, tt.wantErr)
return
}
typeCompare = reflect.TypeOf(tt.want) == reflect.TypeOf(got)
if typeCompare {
t.Errorf("GetMongoClient() = %v, want %v", got, tt.want)
}
})
}
}
Ранее у меня был следующий код, который работал хорошо, однако я должен перевести его в структуру тестирования на основе таблиц.
func TestGetMongoConnection(t *testing.T) {
client, err := GetMongoClient(amp;opts)
if err != nil {
t.Errorf("GetMongoConnect should not return an error but did %d", err)
}
result := reflect.TypeOf(amp;client) == reflect.TypeOf((**mongo.Client)(nil))
if result == false {
t.Errorf("Calling GetMongoConnection didn't return a client %d", err)
}
}
Как я могу заставить табличный код работать хорошо?
Комментарии:
1. @Quesofat
GetMongoClient
объявлен для возврата значения типа*mongo.Client
?2. @TehSphinX Отлично. Можете ли вы опубликовать это как ответ?
3. @Quesofat меня смущает цель вашего теста. Если функция объявлена для возврата типа значения
*mongo.Client
, то вы можете быть уверены, что возвращаемое значение имеет этот тип. Нет необходимости его тестировать.4. Вывод типа существует по какой-то причине. Если ваше приложение зависит от конкретного возвращаемого типа, то, если этот тип будет изменен, оно просто не сможет скомпилироваться, как говорит @Adrian. Если это не зависит от конкретного возвращаемого типа, то нет смысла писать ненужный тест с единственной целью создания такой зависимости.
5. Не говоря уже о том, что я бы использовал проверку отражения для типа. Я действительно не вижу смысла, но у @Quesofat могут быть свои причины.
Ответ №1:
Используйте следующий код, чтобы утверждать, что возвращаемые значения GetClient
имеют типы *mongo.Client, error
:
var got *mongo.Client
var err error
got, err = GetMongoClient(tt.args.opts)
Код компилируется с ошибкой, если GetMongoClient
он изменен, чтобы возвращать разные типы.
Ответ №2:
Чтобы сравнить тип, возвращаемый из функции, с тем же типом, который вы хотите, просто объявите новую переменную с тем же типом и используйте reflect.TypeOf
для сравнения:
type Client struct {
id string
}
func GetClient() *Client {
return amp;Client{id: "bla"}
}
func main() {
want := amp;Client{}
fmt.Println(reflect.TypeOf(want) == reflect.TypeOf(GetClient()))
// prints: true
}
Так что в вашем случае want
должно быть объявлено как amp;mongo.Client{}
.