1

我在对 go 中的 gRPC 服务进行单元测试时遇到了困难。

我查看了测试 gRPC 服务,但它对我不起作用,不确定我做错了什么。

Add 方法的 gRPC 服务实现:

type server struct{}

func main() {
    listener, err := net.Listen("tcp", ":4040")
    if err != nil {
      panic(err)
    }

    srv := grpc.NewServer()
    service.RegisterMathOpServiceServer(srv, &server{})
    reflection.Register(srv)

    if e := srv.Serve(listener); e != nil {
          panic(e)
    }

    fmt.Println("Service is running on localhost:4040")
}

func (s *server) Add(ctx context.Context, request *service.AddRequest) 
(*service.AddResponse, error) {
    a, b := request.GetX(), request.GetY()
    result := a + b

    return &service.AddResponse{Answer: result}, nil
}

Add 方法的单元测试:

package test

import (
    "context"
    pb "mathOp_service/src/service"
    "testing"
)
func TestAddition(t *testing.T) {
    s := server{}   <-- error occurs here
    req := pb.AddRequest{X: int64(1), Y: int64(2)}
    res, err := s.Add(context.Background(), req)

    if res.Answer != 3 {
        t.Error("Expected 1 + 2 to equal 3")
    }
}

项目目录结构

s := server{}抛出一个错误说undefined: server

我很陌生Go,无法找到解决此问题的解决方案。

4

1 回答 1

1

查看您的代码组织,您似乎来自 Java 背景,将 src 和 test 放在相应的文件夹中。当我开始写围棋时,我也遇到了同样的问题。我学到的是,最好将 src 和 test 放在同一个包和文件夹中,这样才能使代码惯用,它还可以解析同一个包中的任何变量/方法引用。所以在你的测试中,你只需要导入 pb 包。

我还将鼓励您查看https://github.com/golang-standards/project-layout以了解Golang 中的各种代码组织技术。

于 2019-05-27T04:12:39.040 回答