如何测试依赖于环境变量的 Rust 方法? [英] How can I test Rust methods that depend on environment variables?

查看:46
本文介绍了如何测试依赖于环境变量的 Rust 方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个库,它会询问其运行环境以将值返回给询问程序.有时就像

I am building a library that interrogates its running environment to return values to the asking program. Sometimes as simple as

pub fn func_name() -> Option<String> {
    match env::var("ENVIRONMENT_VARIABLE") {
        Ok(s) => Some(s),
        Err(e) => None
    }
}

但有时会稍微复杂一些,甚至会产生由各种环境变量组成的结果.如何测试这些方法是否按预期运行?

but sometimes a good bit more complicated, or even having a result composed of various environment variables. How can I test that these methods are functioning as expected?

推荐答案

我如何测试 X"几乎总是用通过控制 X"来回答.在这种情况下,您需要控制环境变量:

"How do I test X" is almost always answered with "by controlling X". In this case, you need to control the environment variables:

use std::env;

fn env_is_set() -> bool {
    match env::var("ENVIRONMENT_VARIABLE") {
        Ok(s) => s == "yes",
        _ => false
    }
}

#[test]
fn when_set_yes() {
    env::set_var("ENVIRONMENT_VARIABLE", "yes");
    assert!(env_is_set());
}

#[test]
fn when_set_no() {
    env::set_var("ENVIRONMENT_VARIABLE", "no");
    assert!(!env_is_set());
}

#[test]
fn when_unset() {
    env::remove_var("ENVIRONMENT_VARIABLE");
    assert!(!env_is_set());
}

但是,您需要注意环境变量是共享资源.来自 set_var 的文档,强调我的:

However, you need to be aware that environment variables are a shared resource. From the docs for set_var, emphasis mine:

将环境变量 k 设置为 当前正在运行的进程的值 v.

Sets the environment variable k to the value v for the currently running process.

您可能还需要注意,Rust 测试运行程序默认情况下并行运行测试,因此一个测试可能会破坏另一个测试.

You may also need to be aware that the Rust test runner runs tests in parallel by default, so it's possible to have one test clobber another.

此外,您可能希望在测试后将环境变量重置"为已知的良好状态.

Additionally, you may wish to "reset" your environment variables to a known good state after the test.

这篇关于如何测试依赖于环境变量的 Rust 方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆