1 个不稳定版本
0.1.0 | 2023年2月6日 |
---|
#333 在 测试
258 每月下载量
22KB
193 行
env_wrapper
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(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应双许可如上,无需任何额外条款或条件。
行为准则
所有行为均受Rust行为准则的约束。