Сохранение типа в структуре для сравнения

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