测试私有函数的惯用方法是什么?

What is the idiomatic way to have a private function tested?

Rust 书 says 使用 "tests" 模块是进行单元测试的惯用方式。但是,如果该功能未标记 'pub',我无法在测试模块中看到来自超级模块的功能。那么应该如何测试内部功能呢?

我的第一反应是想办法 #ifdef 关键字 pub。我过去曾为 C++ 测试这样做过。对于 Rust,我所做的只是简单地测试模块中的私有函数,然后测试 "tests" 模块中的 public 接口。

我做的对吗?

将您的测试模块嵌套在包含私有方法或结构的模块中:

mod inners {
    fn my_func() -> u8 { 42 }

    mod test {
        #[test]
        fn is_answer() {
            assert_eq!(42, super::my_func());
        }
    }
}

当然,我不同意你应该测试一般的私有内容,但那是一个不同的讨论。

测试私有函数的惯用方法不是。单元测试应该测试 class' public 行为。私有方法只是您应该测试的上述 public 方法的实现细节。