4个版本
0.2.0 | 2021年11月4日 |
---|---|
0.1.2 | 2021年7月20日 |
0.1.1 | 2021年7月14日 |
0.1.0 | 2021年5月31日 |
#374 in HTTP客户端
每月115次下载
在 2 Crate 中使用
28KB
404 行
Surf-vcr - 记录和回放HTTP会话
Surf-vcr是Surf HTTP客户端库的测试中间件。Surf-vcr记录客户端与服务器之间的HTTP会话,以便稍后模拟服务器的HTTP响应,为您的客户端提供确定的测试。
高级设计基于VCR for Ruby。
源代码可在SourceHut和Github上找到。可以通过任一服务发送补丁,但CI在SourceHut上运行。
目录
简介
Surf-vcr将HTTP会话记录到YAML文件中,以便您可以手动审查和修改(或甚至创建)请求和响应。然后,您可以注入预先记录的响应到您的客户端会话中。
安装
您通常会将surf-vcr作为开发依赖项使用,因此请通过Cargo将其添加为依赖项
cargo add -D surf-vcr
或手动将其添加到您的Cargo.toml
文件中
[dev-dependencies]
surf-vcr = "0.2.0"
记录
在您的应用程序或相关测试中,以Record
模式将中间件注册到应用程序中。您将连接到功能服务器,并将所有请求和响应记录到文件中。您可以使用同一文件并发地安全回放和记录多个HTTP会话(测试)。
Surf-vcr必须在修改Request
或Response
的任何其他中间件之后注册;否则它将看不到它们的修改并无法记录它们。
我发现使用应用程序中的函数创建带有中间件的Surf客户端很有用,然后在测试中也调用该函数,这样我就知道我的测试客户端和应用程序客户端是相同的
fn create_surf_client() -> surf::Client {
let session = MySessionMiddleware::new();
surf::Client::new()
.with(session)
}
#[cfg(test)]
mod tests {
use super::*;
use async_std::task;
use surf_vcr::{VcrError, VcrMiddleware, VcrMode};
async fn create_test_client(mode: VcrMode, cassette: &'static str)
-> std::result::Result<surf::Client, VcrError>
{
let client = create_surf_client()
.with(VcrMiddleware::new(mode, cassette).await?);
Ok(client)
}
#[async_std::test]
async fn test_example_request() {
let client = create_test_client(
mode::VcrMode::Record,
"sessions/my-session.yml"
).await.unwrap();
let req = surf::get("https://www.example.com")
.insert_header("X-my-header", "stuff");
let mut res = client.send(req).await.unwrap();
assert_eq!(res.status(), surf::StatusCode::Ok);
let content = res.body_string().await.unwrap();
assert!(content.contains("illustrative examples"));
}
}
回放
要模拟服务器的响应,只需将 VcrMode::Record
改为 VcrMode::Replay
,然后重新运行您的测试。Surf-vcr 将查找每个请求,拦截它,并返回保存的响应。
修改录制内容
您可以在将数据写入磁带文件之前修改数据。当处理敏感或动态数据时,这很有用。
VcrMiddleware::new(VcrMode::Record, path).await?
.with_modify_request(|req| {
req.headers
.entry("session-key".into())
.and_modify(|val| *val = vec!["...(erased)...".into()]);
})
.with_modify_response(|res| {
res.headers
.entry("Set-Cookie".into())
.and_modify(|val| *val = vec!["...(erased)...".into()]);
});
许可证
所有源代码均受 MPL 2.0 许可协议 的约束。
贡献
欢迎提交补丁和拉取请求。对于主要功能或破坏性更改,请先提交工单或开始讨论,以便我们讨论您想做什么。
依赖项
~8–21MB
~327K SLoC