Часть вашей проблемы здесь заключается в том, что код, который создает клиент, - это код, который вы пытаетесь протестировать с макетом.
Используя интерфейс, вы можете передать макет в метод / функцию, которыеВы пытаетесь проверить.Шаг 1. будет разделять код, который создает клиент, из кода, в который вы хотите внедрить макет.
Вы должны определить интерфейс, который вы пытаетесь смоделировать, это позволит вам поменять местами фактический/ Реальная реализация для поддельной / фиктивной версии, что-то вроде:
type ImagesGetter interface {
func GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error)
}
Затем создайте новый тип структуры, который позволит вам установить фиктивную / реальную реализацию.
type Lister struct {
images ImagesGetter
}
func (l *Lister) GetImagesList() {
// trimmed, but the grpc client should be defined
// and constructed outside this function and passed
// in in the images field of the Lister.
resp, err := l.images.GetImages(ctx, &pb.GetImagesRequest)
// trimmed ..
}
ВыТеперь можно построить новую модель Lister
с фиктивной реализацией:
type mock struct {}
func (m *mock) GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error) {
// do mock implementation things here
}
И использовать ее:
l := &Lister{images: &mock{}}