unit-testing - 使用 grpc.SetHeader 或 grpc.SendHeader 调用测试函数时无法设置 header

标签 unit-testing go grpc grpc-go

我有一个函数可以在 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/

相关文章:

reactjs - React Jest - 意外的 token 导入

go - 具有相对路径的包布局

python - 如何处理多个gRPC future?

.net-core - 没有 ASP.Net 的 grpc-dotnet 服务器

java - "Bridging"来自 gRPC StreamObserver 的 Reactor 的 Flux

Android RecyclerView 适配器项目计数在单元测试中返回 0

Python 单元测试 Google Bigquery

entity-framework - 如何处置 Entity Framework Core 内存数据库

go - `bufio.Writer` 还是 `io.Writer`?

go - 如何处理 Go 包中支持文件的路径?