我有一个函数可以在 grpc 头文件中添加一些东西
func Dummy(ctx context.Context, request *service.Request) error {
err := grpc.SetHeader(ctx, metadata.Pairs("key", "value"))
return err
}
当它被服务调用时,它工作正常。
在为此编写单元测试用例时,它总是失败:
rpc error: code = Internal desc = grpc: failed to fetch the stream from the context context.TODO
func TestDummy() {
ctx := context.TODO()
err := Dummy(ctx, &service.Request{})
}
我知道我可以模拟 grpc.SetHeader
,但我不想那样做。我们还有其他方法可以解决这个问题吗?
最佳答案
错误发生是因为 context.TODO()
中没有服务器流实现。您可以使用 grpc.NewContextWithServerTransportStream
而不是 context.TODO()
.
您仍然需要模拟 ServerTransportStream
虽然界面,但这并不过分复杂。其实这个接口(interface)的目的就是让测试使用了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{})
}
关于unit-testing - 使用 grpc.SetHeader 或 grpc.SendHeader 调用测试函数时无法设置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74391247/