2 个版本
0.0.3-alpha2 | 2022 年 10 月 30 日 |
---|---|
0.0.3-alpha1 | 2021 年 11 月 7 日 |
#1129 在 开发工具
233 每月下载量
用于 rocketmq
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