#http #http-response #surf #client #server-response #middleware

surf-vcr

记录和回放HTTP会话以进行surf客户端测试

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客户端

Download history 5/week @ 2024-03-12 1/week @ 2024-03-26 12/week @ 2024-04-02 1/week @ 2024-04-23 1/week @ 2024-05-28 1/week @ 2024-06-04 114/week @ 2024-06-11

每月115次下载
2 Crate 中使用

MPL-2.0 许可证

28KB
404

Surf-vcr - 记录和回放HTTP会话

Surf-vcr是Surf HTTP客户端库的测试中间件。Surf-vcr记录客户端与服务器之间的HTTP会话,以便稍后模拟服务器的HTTP响应,为您的客户端提供确定的测试。

高级设计基于VCR for Ruby。

源代码可在SourceHutGithub上找到。可以通过任一服务发送补丁,但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必须在修改RequestResponse的任何其他中间件之后注册;否则它将看不到它们的修改并无法记录它们。

我发现使用应用程序中的函数创建带有中间件的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