go - 如何做 Mock Go-lang GRPC 方法

标签 go mocking glide-golang

func GetImagesList() {
   conn, err := grpc.Dial(address, grpc.WithInsecure())
   if err != nil {
      Log.Info("did not connect: %v", err)
   }

   defer conn.Close()

   // Get Client from the grpc connection
   client := pb.NewGrpcClient(conn)
   resp, err := client.GetImages(context.Background(), 
      &pb.ImageListRequest{})
 }

如何模拟 GetImagesList GRPC 方法 请帮帮我。 谢谢

最佳答案

这里的部分问题是创建客户端的代码是您尝试使用模拟测试的代码。

使用接口(interface),您可以将模拟传递到您要测试的方法/函数中。第 1 步。将创建客户端的代码与您要注入(inject)模拟的代码分开。

你应该定义一个你试图模拟的接口(interface),它将允许你将实际/真实的实现换成一个假的/模拟的版本,比如:

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

关于go - 如何做 Mock Go-lang GRPC 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50633986/

相关文章:

c# - 为什么 Rhino Stubs 允许我对它们设定期望值?

java - 如何模拟存在但无法读取的路径

go - 类型别名在 Go 中如何工作?

javascript - zserge/lorca ui.Eval 没有返回值

python - 在pytest中模拟一个连接类

go - 为什么在使用 vendor 目录中的依赖项与 gopath 中的依赖项构建时,go 应用程序二进制文件的大小不同?

web-services - 在后台运行 golang web 服务器

go - jsonrpc 服务器接受请求的小写方法名称(用于大写注册服务)

go - 如何将 [1024]C.char 转换为 [1024]byte

go - 在 golang 的 map 中使用 string[][] 时复合文字中缺少类型