#grpc-server #mocking #requests #applications #rpc #wiremock #outgoing

wiremock-grpc

模拟 gRPC 服务器以测试您的出站 gRPC 请求

2 个版本

0.0.3-alpha22022 年 10 月 30 日
0.0.3-alpha12021 年 11 月 7 日

#1129开发工具

Download history 67/week @ 2024-03-11 13/week @ 2024-03-18 64/week @ 2024-04-01 33/week @ 2024-04-08 16/week @ 2024-04-15 33/week @ 2024-04-22 7/week @ 2024-04-29 4/week @ 2024-05-06 5/week @ 2024-05-13 28/week @ 2024-05-20 25/week @ 2024-05-27 12/week @ 2024-06-03 104/week @ 2024-06-10 58/week @ 2024-06-17 57/week @ 2024-06-24

233 每月下载量
用于 rocketmq

MIT/Apache

25KB
509

wiremock grpc

用于测试 Rust 应用程序的 gRPC 模拟。


示例

生成服务器代码

对于每个需要生成的 gRPC 服务器代码,请使用 generate! 宏。

mod wiremock_gen {
    // hello.Greeter: is the prefix of all rpc,
    // MyMockServer: name of the generated Server,
    wiremock_grpc::generate!("hello.Greeter", MyMockServer);
}
use wiremock_gen::*;  // this imports generated
use wiremock_grpc::*; // this imports MockBuilder

使用方法

#[tokio::test]
async fn default() {
    // Server (MyMockServer is generated above)
    let mut server = MyMockServer::start_default().await;

    let request1 = server.setup(
        MockBuilder::when()
            //    👇 RPC prefix
            .path("/hello.Greeter/SayHello")
            .then()
            .return_status(Code::Ok)
            .return_body(|| HelloReply {
                message: "Hello Mustakim".into(),
            }),
    ); // request1 can be used later to inspect the request

    // Client
    // Client code is generated using tonic_build
    let channel =
        tonic::transport::Channel::from_shared(format!("http://[::1]:{}", server.address().port()))
            .unwrap()
            .connect()
            .await
            .unwrap();
    let mut client = GreeterClient::new(channel);

    // Act
    let response = client
        .say_hello(HelloRequest {
            name: "Mustakim".into(),
        })
        .await
        .unwrap();

    assert_eq!("Hello Mustakim", response.into_inner().message);

    // Inspect the request
    // multiple requests
    let requests = server.find(&request1);
    assert!(requests.is_some(), "Request must be logged");
    assert_eq!(1, requests.unwrap().len(), "Only 1 request must be logged");

    // single request
    let request = server.find_one(&request1);
    assert_eq!(
        format!(
            "http://[::1]:{}/hello.Greeter/SayHello",
            server.address().port()
        ),
        request.uri
    );
}

注意

  • 如果设置了规则但没有收到请求,则在丢弃时会引发 panic。
  • 未设置任何规则的请求将返回 Unimplemented gRPC 状态。

限制

  • 您必须以字符串形式传递服务前缀(例如,hello.Greeter)或 RPC 路径(例如,/hello.Greeter/SayHello)。这些路径使用 tonic_build 在生成的代码中以字符串字面量形式编写。我必须找出如何从生成的代码的给定类型或函数中访问这些字符串字面量。
  • 您无法监视发送到模拟服务器的请求体或根据特定的请求体设置模拟。我尚未完全掌握 🦀 以实现此目的。

依赖项

~8.5MB
~151K SLoC