1 个不稳定版本

0.1.0 2023年2月6日

#333测试

Download history 136/week @ 2024-03-10 12/week @ 2024-03-17 79/week @ 2024-03-24 120/week @ 2024-03-31 75/week @ 2024-04-07 47/week @ 2024-04-14 68/week @ 2024-04-21 4/week @ 2024-04-28 13/week @ 2024-05-05 140/week @ 2024-05-12 17/week @ 2024-05-19 63/week @ 2024-05-26 31/week @ 2024-06-02 123/week @ 2024-06-09 88/week @ 2024-06-16 15/week @ 2024-06-23

258 每月下载量

MIT/Apache

22KB
193

env_wrapper

Build

std::env 函数的包装器,允许在测试期间注入测试替身。

限制

目前,这个包仅适用于类Unix系统。

动机

测试依赖于环境变量状态的代码可能会很脆弱,因为状态可能在测试之间改变或被其他测试污染。理想的解决方案是每个测试都有一个私有的环境变量集合,这样这些问题就不会发生。

方法

这个包引入了 RealEnvironment(std::env 函数的包装器)和 FakeEnvironment 结构体,它们实现了 Environment 特性。而不是直接使用 std::env,使用 RealEnvironment 进行依赖注入,这样每个测试都可以有一个私有环境变量集合。

示例

场景:一个应用程序查找 CONFIG_LOCATION 环境变量的存在。如果没有设置,它将使用默认位置。

use env_wrapper::{Environment, RealEnvironment};

const CONFIG_LOCATION_ENV_VAR_NAME: &str = "CONFIG_LOCATION";
const DEFAULT_CONFIG_LOCATION: &str = "/etc/my_app/service.conf";

fn main() {
    // In the production code, inject RealEnvironment.
    let real_env = RealEnvironment;
    let config_location = get_config_location(real_env);
}

fn get_config_location(env: impl Environment) -> String {
    match env.var(CONFIG_LOCATION_ENV_VAR_NAME) {
        Ok(location) => location,
        _ => DEFAULT_CONFIG_LOCATION.to_string(),
    }
}

#[test]
fn when_the_user_has_set_the_config_location_env_var_then_use_that_location() {
    use env_wrapper::FakeEnvironment;

    // Arrange
    // Each test should have a separate instance of FakeEnvironment.
    let mut fake_env = FakeEnvironment::new();
    let user_specified_location = "/a/user/specified/location";
    fake_env.set_var(CONFIG_LOCATION_ENV_VAR_NAME, user_specified_location);
    
    // Act
    // In the test code, inject FakeEnvironment.
    let location = get_config_location(fake_env);

    // Assert
    assert_eq!(location, user_specified_location);
}

许可证

在以下许可证中选择一种:

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应双许可如上,无需任何额外条款或条件。

行为准则

所有行为均受Rust行为准则的约束。

无运行时依赖