我有一个函数添加一些东西到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{})
}