使用grpc调用测试函数时无法设置header.seheader或grpc.SendHeader &



我有一个函数添加一些东西到grpc头

func Dummy(ctx context.Context, request *service.Request) error {
err := grpc.SetHeader(ctx, metadata.Pairs("key", "value"))
return err
}

当它被service调用时可以正常工作。

当为this编写单元测试用例时,它总是失败:

rpc error: code = Internal desc = grpc: failed to fetch the stream from context context。TODO

func TestDummy() {
ctx := context.TODO()
err := Dummy(ctx, &service.Request{})
}

我知道我可以嘲笑grpc.SetHeader,但我不想那样做。我们还有别的办法解决这个问题吗?

发生错误是因为在context.TODO()中没有服务器流实现。你可以用grpc.NewContextWithServerTransportStream代替context.TODO()

您仍然需要模拟ServerTransportStream接口,但这并不太复杂。实际上,这个接口的目的就是允许测试使用grpc.SetHeader的代码。

框架代码:

type mockServerTransportStream struct {}
func (m *mockServerTransportStream) Method() string {
return "foo"
}
func (m *mockServerTransportStream) SetHeader(md metadata.MD) error {
return nil
}
func (m *mockServerTransportStream) SendHeader(md metadata.MD) error {
return nil
}
func (m *mockServerTransportStream) SetTrailer(md metadata.MD) error {
return nil
}
func TestDummy() {
ctx := grpc.NewContextWithServerTransportStream(&mockServerTransportStream{})
err := Dummy(ctx, &service.Request{})
}

最新更新