我希望能够在我的代码本身内检查它是否在测试中运行。这样做是理想的,例如,与测试数据库,Web服务等接口。一个简单的bool
就足够了。
Rust是否有现有的API?
答案 0 :(得分:6)
运行测试时没有设置全局变量。你可以添加一个,但要做到这一点非常复杂。此示例不完全正确:
use std::cell::Cell;
thread_local! {
pub static IS_TESTING: Cell<bool> = Cell::new(false);
}
fn my_code() -> u8 {
if IS_TESTING.with(|t| t.get()) {
0
} else {
42
}
}
#[test]
fn one() {
IS_TESTING.with(|t| t.set(true));
assert_eq!(0, my_code());
IS_TESTING.with(|t| t.set(false));
}
要正确执行此操作,您需要处理以下事项:
更有可能的是,您想要检测您是否正在编译进行测试。这更简单,您可能已经使用相同的技术自行有条件地编译测试:
fn my_code() -> u8 {
if cfg!(test) {
0
} else {
42
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn one() {
assert_eq!(0, my_code());
}
}
trait ValueSource {
fn value(&self) -> u8;
}
struct ProductionSource;
impl ValueSource for ProductionSource {
fn value(&self) -> u8 {
42
}
}
fn my_code<S>(source: S) -> u8
where
S: ValueSource,
{
source.value()
}
#[cfg(test)]
mod test {
use super::*;
struct TestSource(u8);
impl ValueSource for TestSource {
fn value(&self) -> u8 {
self.0
}
}
#[test]
fn one() {
let src = TestSource(99);
assert_eq!(99, my_code(src));
}
}
这会将相关细节集中到一个对象中,编译器将调用单一化,从而生成优化代码。