是否有任何方法为rust结构附加一些调试字段?



例如,我希望结构体S仅在测试时具有name_count字段,因此我可以操作last_name来验证测试中关于name_count的一些属性。

pub struct S {
last_name: String,
#[cfg(test)] {
// This field only exists in tests
name_count: HashMap<String, i32>,
}
}
impl S {
fn record_last_name(&mut self, name: String) {
self.last_name = name;
if cfg!(test) {
// Increase self.name_count[self.last_name]
}
}
}
#[test]
fn test_last_name_count() {
let mut s = S {};
...
// assert some properties about name_count
}

然而,这段代码不能编译,似乎Rust不支持#[cfg(test)]内部定义的结构,所以我想知道我怎么做。

您可以这样做,但是#[cfg(test)]是一个属性宏,所以它适用于它后面的任何内容,并且不需要像您编写的那样使用块作用域。

您还需要将#[cfg(...)]属性添加到函数和方法中,以确保您不会得到"missing field"/"no field named…"编译器错误。

use std::collections::HashMap;
pub struct S {
last_name: String,
#[cfg(test)]
// This field only exists in tests
name_count: HashMap<String, i32>,
}
impl S {
#[cfg(test)]
fn record_last_name(&mut self, name: String) {
self.last_name = name;
// Increase self.name_count[self.last_name]
}
}
#[cfg(not(test))]
fn main() {
let mut s = S { last_name: "Foo".to_string() };
}
#[test]
fn test_last_name_count() {
let mut s = S { last_name: "Foo".to_string(), name_count: HashMap::new() };
// assert some properties about name_count
}

相关内容

最新更新