【问题标题】:Rust book unit test example results in dead code warning - why?Rust book 单元测试示例导致死代码警告 - 为什么?
【发布时间】:2021-03-01 16:33:32
【问题描述】:

在学习 Rust 并尝试 Rust 书中的示例单元测试相关代码时:https://doc.rust-lang.org/book/ch11-01-writing-tests.html

我收到有关单元测试显然正在执行的死代码的警告。这是为什么呢?

lib.rs 中的代码

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn larger_can_hold_smaller() {
        let larger = Rectangle {
            width: 8,
            height: 7,
        };
        let smaller = Rectangle {
            width: 5,
            height: 1,
        };

        assert!(larger.can_hold(&smaller));
    }
}

运行货物测试时的结果

$ cargo test
   Compiling adder v0.1.0 (/Users/khorkrak/projects/rust/adder)
warning: associated function is never used: `can_hold`
 --> src/lib.rs:8:8
  |
8 |     fn can_hold(&self, other: &Rectangle) -> bool {
  |        ^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted

    Finished test [unoptimized + debuginfo] target(s) in 0.19s
     Running target/debug/deps/adder-1082c4b063a8fbe6

running 1 test
test tests::larger_can_hold_smaller ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests adder

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

$ rustc --version
rustc 1.50.0 (cb75ad5db 2021-02-10)

【问题讨论】:

  • 我注意到,如果我运行指定 --lib 的测试,这不会发生。我仍然不清楚为什么它在没有 --lib 的情况下会这样工作。
  • 这能回答你的问题吗? How to suppress "function is never used" warning for a function used by tests? "...仅用于测试的代码在真正的可执行文件中不需要,可能不应该包含在内。"
  • 不完全——因为这段代码不仅仅是用于测试的代码。然而,答案在最后的评论中:“因为其他回复并没有非常明确地说明这一点,我不得不自己重新发现这一点:如果你在一个库函数上收到死代码警告你有测试,一个常见的原因是你忘了把它标记为 pub。- rspeer 2019 年 7 月 18 日 21:49"

标签: unit-testing rust dead-code


【解决方案1】:

改变这个

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

这样会使死代码警告消失。

pub struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    pub fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

测试的结构和方法都需要公开。

【讨论】:

  • 遗憾的是,执行此警告后,即使未使用该功能,也不会再次出现
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多