2

我有 gRPC 服务(比如 svc1),它使用它的 gRPC 存根(比如 svc2_client)调用另一个 gRPC 服务。

我已经为 svc2_client 生成了客户端模拟。根据文档进行的单元测试工作正常,即使用生成的模拟测试 svc2_client。

但是,我有 svc1,如下所示:

// Synonymous to proto service generated.
type Svc1 struct {
    rt svc2pb.Svc2Client
}

// Constructor to get Service.
func NewSvc1(rt svc2pb.Svc2Client) *Svc1 {
    return &Svc1{rt}
}
...
...

预期行为
期待它成功

重现行为的重现
步骤:

返回错误:

=== RUN   TestMethod1Svc1

    TestMethod1Svc1: svc1.go:40: Unexpected call to *mock_svc2client.MockSvc2Client.Method1([context.Background.WithDeadline(2020-06-22 10:14:25.620736 +0530 IST m=+3.002262784 [2.999757626s]) key1:"1"  } ]) at ...server/mocks/svc2client_mock.go:65 because: there are no expected calls of the method "Method1" for that receiver
--- FAIL: TestMethod1Svc1 (0.00s)

围棋新手,你能帮我吗?

附加信息:

  • gomock 模式(来源):来源
  • gomock 版本或 git 参考:github.com/golang/mock v1.4.3
  • golang 版本:go 版本 go1.14 darwin/amd64
4

2 回答 2

3

您正在尝试调用尚未模拟的函数。

基本上,当您执行 mock_client 并在其中调用函数时,您必须确保函数也被模拟。您还必须为您的模拟函数提供自定义输入和自定义输出。

你可以参考这个:gomock-blog

你可以看到这一行 crankingCircuit.EXPECT().RotateShaft().Return(nil).Times(2) 告诉 mock_client 期待函数的调用RotateShaft

根据 API,您必须更改模拟函数中的输入参数和输出参数。

于 2020-07-01T15:53:01.090 回答
0

也可能有这种情况,我忘记调用mock()函数了。

for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
        tt.mock(tt.input)
        s := NewServiceServer(dbObject, queueObject)
        _, err := s.ListConstraint(ctx, tt.input)
        if (err != nil) != tt.isErr {
            t.Errorf("ServiceServer.ListC() error = %v, wantErr %v", err, tt.isErr)
            return
        }

    })
}
于 2020-12-08T12:59:07.447 回答