首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TWIRP开发的测试RPC服务

使用TWIRP开发的测试RPC服务
EN

Stack Overflow用户
提问于 2020-10-20 00:28:27
回答 1查看 332关注 0票数 1

我想测试一个样例Twirp服务。示例服务来自Twirp官方网站

Protobuf的定义如下:

代码语言:javascript
复制
syntax = "proto3";

package helloservice;
option go_package = "helloservice";

service HelloWorld {
  rpc Hello(HelloReq) returns (HelloResp);
}

message HelloReq {
  string subject = 1;
}

message HelloResp {
  string text = 1;
}

服务器实现:

代码语言:javascript
复制
type HelloWorldServer struct{}

func (s *HelloWorldServer) Hello(ctx context.Context, req *pb.HelloReq) (*pb.HelloResp, error) {
    return &pb.HelloResp{Text: "Hello " + req.Subject}, nil
}

我试过这里建议的解决方案,但是ClientConn和HTTPClient之间有一些混淆。到目前为止,我有这个

代码语言:javascript
复制
var Once sync.Once
const bufSize = 1024 * 1024
var listener *bufconn.Listener

func InitTestServer(t *testing.T) *gomock.Controller {
    Once.Do(func(){
        listener = bufconn.Listen(bufSize)
        server := &server.HelloWorldServer{}
        twirpHandler := pb.NewHelloWorldServer(server, nil)
        mux := http.NewServeMux()
        mux.Handle(twirpHandler.PathPrefix(), twirpHandler)
        httpServer := http.Server{
            Handler: mux,
        }
        go func() {
            if err := httpServer.Serve(listener); err != nil {
                if err != http.ErrServerClosed {
                    log.Fatalln("Failed to start http listener", "error", err)
                }
            }
        }()
    })
    ctrl := gomock.NewController(t)
    return ctrl
}

func bufDialer(context.Context, string) (net.Conn, error) {
    return listener.Dial()
}

func TestCreate(t *testing.T) {
    //ctrl := InitTestServer(t)
    InitTestServer(t)
    ctx := context.Background()
    conn, err := grpc.DialContext(ctx, "", grpc.WithInsecure(), grpc.WithContextDialer(bufDialer))
    // conn is of type *ClientConn
    if err != nil {
        t.Fatalf("Failed to dial bufnet: %v", err)
    }
    defer conn.Close()
    //NewHelloWorldJSONClient accepts only HTTPClient
    client := pb.NewHelloWorldJSONClient(conn)
    response, err := client.Hello(ctx, &pb.HelloReq{
        Subject: "sample",
    })
    t.Log(response, err)
}

有任何方法将其中一个转换为另一个,或者测试Twirp的任何其他方式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-19 10:06:26

您可以使用net/http/httptest来完成这种测试。

  1. 使用pb.NewHelloWorldServer创建处理程序,并为其提供服务器实现结构。
  2. 使用处理程序创建httptest.NewServer
  3. .URL中使用httptest服务器的pb.NewHelloWorldJSONClient (或protobuf,或两者兼用)。

作为一个简单的例子:

代码语言:javascript
复制
package main

import (
    "context"
    "net/http"
    "net/http/httptest"
    "testing"

    pb "github.com/3ventic/twirphelloworld/rpc"
)

// InitTestServer initializes a test server for HelloWorld and returns its address
func InitTestServer() string {
    handler := pb.NewHelloWorldServer(&HelloWorldServer{})
    server := httptest.NewServer(handler)
    return server.URL
}

func TestHello(t *testing.T) {
    url := InitTestServer()
    clients := map[string]pb.HelloWorld{
        "json": pb.NewHelloWorldJSONClient(url, http.DefaultClient),
        "pb":   pb.NewHelloWorldProtobufClient(url, http.DefaultClient),
    }

    for typ, client := range clients {
        t.Run(typ, func(t *testing.T) {
            ctx := context.Background()
            result, err := client.Hello(ctx, &pb.HelloReq{
                Subject: "test",
            })
            if err != nil {
                t.Error(err)
                t.FailNow()
            }
            if result.Text != "Hello test" {
                t.Errorf("result didn't match 'Hello test', was '%s'", result.Text)
            }
        })
    }
}

这里有完整的例子

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64436839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档