You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Rust结构体添加仅测试环境可见的调试字段?

正确实现测试环境专属结构体字段的方法

你不能用大括号包裹字段来应用#[cfg(test)],但可以直接把这个属性单独加在测试专属字段上。以下是修正后的可行代码:

use std::collections::HashMap;

pub struct S {
    last_name: String,
    #[cfg(test)]
    name_count: HashMap<String, i32>,
}

impl S {
    pub fn new() -> Self {
        S {
            last_name: String::new(),
            #[cfg(test)]
            name_count: HashMap::new(),
        }
    }

    fn record_last_name(&mut self, name: String) {
        self.last_name = name.clone();
        #[cfg(test)]
        {
            *self.name_count.entry(name).or_insert(0) += 1;
        }
    }
}

#[test]
fn test_last_name_count() {
    let mut s = S::new();
    s.record_last_name("Smith".to_string());
    s.record_last_name("Smith".to_string());
    assert_eq!(s.name_count.get("Smith"), Some(&2));
}

关键要点:

  • 直接给name_count字段添加#[cfg(test)]属性,该字段仅在测试编译时存在。
  • 结构体构造函数(比如new)里要对应加上#[cfg(test)]初始化测试字段,避免编译错误。
  • 在record_last_name方法中,用#[cfg(test)]块包裹操作name_count的逻辑,非测试环境下这段代码会被完全忽略。
  • 测试函数中可直接访问name_count字段,因为测试编译时该字段存在。

如果需要更复杂的条件拆分,也可以通过完全分离测试和非测试版本的结构体实现,但上述方法是最简洁的常规方案。

内容的提问来源于stack exchange,提问作者calvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:24:32