Testing 如何在锈菌中测试私有方法?

Testing 如何在锈菌中测试私有方法?,testing,rust,Testing,Rust,如何在锈菌中测试私有方法?我没有找到任何关于它的信息。文档中也没有任何信息。当使用#[test]时,私有或公共方法没有什么特别之处,您只是编写了完全正常的函数,可以访问它们可以访问的任何内容 fn private_function() { } #[test] fn test_private_function() { private_function() } 外部测试,如tests/*.rs和examples/*.rs如果您使用的是Cargo或doc测试,则无法访问私人成员;他们也不应

如何在锈菌中测试私有方法?我没有找到任何关于它的信息。文档中也没有任何信息。

当使用
#[test]
时,私有或公共方法没有什么特别之处,您只是编写了完全正常的函数,可以访问它们可以访问的任何内容

fn private_function() {
}

#[test]
fn test_private_function() {
    private_function()
}

外部测试,如
tests/*.rs
examples/*.rs
如果您使用的是Cargo或doc测试,则无法访问私人成员;他们也不应该这样做:这些测试设计为公共API测试,而不是处理实现细节。

我不知道这个问题是否仍然存在,但我找到了一些相关文档:

我从中保留的是,您可以测试私有方法,但前提是测试可以看到它(即,它们在同一范围内),因为测试与任何其他函数一样遵循可见性规则

以下是一个工作示例:

pub fn add_two(a: i32) -> i32 {
    internal_adder(a, 2)
}

fn internal_adder(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn internal() {
        assert_eq!(4, internal_adder(2, 2));
    }
}

总之,请记住,在测试社区中,是否应该测试私有方法的争论仍然是公开的。双方都有有效的论点,正确的答案只取决于您、您对测试过程的看法和项目的上下文。

外部测试绝对应该允许访问私有部分,因为1)您可能需要访问私有部分,以便通过公共API可靠地触发所有代码路径。例如,可能存在一个内部阈值,当达到该阈值时会触发不同的代码路径。您可能还需要故障注入或内部详细信息来触发边缘情况。2) 访问专用部件可以在测试失败时提供更好的诊断-您可以在紧急消息等中插入内部信息。诊断:这就是
std::fmt::Debug
的目的。对于其余部分,我坚持我的立场,即外部测试不应访问私人细节。外部测试不适合您描述的情况,这正是内部单元测试的目的。
fmt::Debug
在某些情况下过于粗粒度,例如,当您仅在特定位之后时,可能不希望打印整个庞大数据结构的详细信息。无论如何,内部测试是否也适合设置公共API的实际用例?如果没有,那就不行,因为我需要这样做。如果是的话,那么好吧,我很乐意接受所有的测试和内部测试,尽管在这一点上,区别是没有意义的?核心问题是,无论您如何努力,实现细节总是以某种方式影响接口,这是无法避免的。