#stdio #testing #stderr #stdout #stdin #env #io-operations

io-providers

允许许多 I/O 操作的依赖注入

6 个版本

使用旧的 Rust 2015

0.2.0-beta.32018 年 9 月 23 日
0.2.0-beta.22018 年 9 月 20 日
0.1.2 2015 年 9 月 25 日

文件系统 中排名 720

MIT 许可证

61KB
998

io-providers 构建状态 最新版本 文档 许可证

定义了不同类型 I/O 操作的 "provider" 特性和实现,使得依赖注入变得非常有助于测试。

支持多种不同的 I/O 类型

  • 通过 Env 支持进程环境(变量、工作目录等)
  • 通过 StdStreams 支持标准流(stdin、stdout 和 stderr)
  • 通过 Fs 支持文件系统访问

除了每个特性的 "原生" 实现之外,还内置了 "模拟" 实现

  • SimulatedEnv 用于模拟进程环境状态
  • SimulatedStdStreams 用于模拟标准流输入并检查输出
  • TempFs 用于在类似于 chroot 的沙箱中执行文件系统访问,从而与文件系统的其余部分隔离

每个提供者特质都可以独立使用,但还有一个包罗万象的 Io 特质,它提供了对所有这些特质的访问。如果您有多种 I/O 依赖项,创建和传递单个 &mut Io 可能是最简单的。

文档

https://docs.rs/io-providers/

示例

Cargo.toml:

[dependencies]
io-providers = "0.2.0-beta.2"

src/main.rs:

extern crate io_providers;

use std::io::Write;
use std::path::Path;
use io_providers::{Env, Io, NativeIo, SimulatedIo, StdStreams};

/// Gets the current working directory and prints it to stdout.
fn do_work<I: Io>(io: &mut I) {
    let cur_dir = io.env().current_dir().unwrap();
    let stdout = io.std_streams().output();
    writeln!(stdout, "The current directory is: {}", cur_dir.to_str().unwrap()).unwrap();
}

fn main() {
    // Test `do_work()` using a simulated I/O environment
    let mut simulated_io = SimulatedIo::new().unwrap();
    simulated_io.env_mut().set_current_dir(Path::new("/foo/bar")).unwrap();
    do_work(&mut simulated_io);
    assert_eq!(
        "The current directory is: /foo/bar\n",
        ::std::str::from_utf8(simulated_io.std_streams().read_output()).unwrap());

    // Now use a native I/O provided to access the real system
    let mut real_io = NativeIo::new();
    do_work(&mut real_io);
}

许可证

io-providers 根据 MIT 许可证 发布。

依赖项

~2–10MB
~108K SLoC