如何进行模拟Go lang GRPC方法

如何进行模拟Go lang GRPC方法,go,mocking,glide-golang,Go,Mocking,Glide Golang,如何做模拟GetImagesList GRPC方法请帮助我。 谢谢这里您的部分问题在于创建客户机的代码,即您试图用模拟测试的代码 使用接口,您可以将模拟传递到您尝试测试的方法/函数中。第一步。将从要注入模拟的代码中拆分创建客户机的代码 您应该定义一个试图模拟的接口,它将允许您将实际/真实的实现替换为一个假/模拟版本,例如: func GetImagesList() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if er

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

这里您的部分问题在于创建客户机的代码,即您试图用模拟测试的代码

使用接口,您可以将模拟传递到您尝试测试的方法/函数中。第一步。将从要注入模拟的代码中拆分创建客户机的代码

您应该定义一个试图模拟的接口,它将允许您将实际/真实的实现替换为一个假/模拟版本,例如:

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{})
 }
然后创建一个新的结构类型,允许您设置模拟/真实实现

type ImagesGetter interface {
    func GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error)
}
现在,您可以使用模拟实现构建新的Lister模型:

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 ..
}
并使用它:

type mock struct {}

func (m *mock) GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error) {
    // do mock implementation things here
}

这里的部分问题是,创建客户机的代码是您试图用模拟测试的代码

使用接口,您可以将模拟传递到您尝试测试的方法/函数中。第一步。将从要注入模拟的代码中拆分创建客户机的代码

您应该定义一个试图模拟的接口,它将允许您将实际/真实的实现替换为一个假/模拟版本,例如:

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{})
 }
然后创建一个新的结构类型,允许您设置模拟/真实实现

type ImagesGetter interface {
    func GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error)
}
现在,您可以使用模拟实现构建新的Lister模型:

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 ..
}
并使用它:

type mock struct {}

func (m *mock) GetImages(ctx context.Context, in *pb.ImageListRequest) (*pb.ImageListResponse, error) {
    // do mock implementation things here
}

我们如何在没有连接接口的情况下为单元测试实例化客户端?无法对类似场景进行单元测试,其中1个RPC服务方法正在调用另一个RPC 2方法。若我们需要对RPC服务1进行单元测试,则必须通过RPC 2模拟客户端,但我无法实现此类模拟。我已经尝试过gomock-如果我们直接验证RPC2,它可以正常工作,但是在RPC服务1上,它返回一个错误,关于此方法不存在控制器。虽然是围棋新手,但我倾向于创建类似上面的东西,而不是依赖模拟框架,我们如何做到这一点?我们如何为没有连接接口的单元测试实例化客户端?无法对类似场景进行单元测试,其中1个RPC服务方法正在调用另一个RPC 2方法。若我们需要对RPC服务1进行单元测试,则必须通过RPC 2模拟客户端,但我无法实现此类模拟。我已经尝试过gomock-如果我们直接验证RPC2,它可以正常工作,但是在RPC服务1上,它返回一个错误,关于此方法不存在控制器。虽然是围棋新手,但我倾向于创建类似上面的东西,而不是依赖模拟框架,我们该怎么做呢?