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

Unit testing 测试私有函数的惯用方法是什么?,unit-testing,rust,idioms,Unit Testing,Rust,Idioms,Rust book认为使用“tests”模块是进行单元测试的惯用方法。但是,如果超级模块中的某个函数未标记为“pub”,则我无法在测试模块中看到该函数。那么应该如何测试内部功能呢 我的第一反应是寻找一种方法来#ifdef关键字pub。过去我做过C++测试。因为我所做的只是在模块中测试私有函数,然后在“测试”模块中测试公共接口 我做得对吗?将测试模块嵌套在包含私有方法或结构的模块中: mod inners { fn my_func() -> u8 { 42 } mod te

Rust book认为使用“tests”模块是进行单元测试的惯用方法。但是,如果超级模块中的某个函数未标记为“pub”,则我无法在测试模块中看到该函数。那么应该如何测试内部功能呢

我的第一反应是寻找一种方法来
#ifdef
关键字
pub
。过去我做过C++测试。因为我所做的只是在模块中测试私有函数,然后在“测试”模块中测试公共接口


我做得对吗?

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

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

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

当然,我不同意一般情况下应该测试私有函数,但这是一个不同的讨论。

测试私有函数的惯用方法是不测试私有函数。单元测试应该测试类的公共行为。私有方法只是上述公共方法的实现细节,您应该对其进行测试。

我有一些简单的内部结构,不需要记录、打印或做任何事情。称为它们的公共例程会这样做。因此,我的单元测试是安静的、幂等的。这不是测试外部访问,而外部访问通常隐藏在代码的私有区域中。@SeanPerry我不同意经常测试外部访问。事实上,将纯粹的逻辑公开为公共函数或方法,让下游消费者可以使用,这就更好了。您可以测试公共接口,库的用户处理IO位。有时您需要访问实现细节,以便通过公共API触发特定行为。一个简单的例子是测试数组排序方法:在数量较少的情况下,即大约10个元素,使用bubblesort而不是quicksort(或类似)通常更快。阈值是一个私有的实现细节,但您需要知道它才能在测试中可靠地触发两个代码路径。起初我已经这样做了,但我正在做
使用super::*
。如果我只是显式地
使用super::some_函数
,它就如您所描述的那样工作。谢谢。@SeanPerry AFAIK glob导入不包括函数,只包括类型。我使用glob导入的少数几次之一是在编写测试模块时,因为我通常想测试父模块中的所有内容。@Shepmaster在
mod test
上使用
#[cfg(test)]
不是一个好的做法吗?