如何在Rust中测试私有方法?

アレッ*_*ックス 21 testing rust

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

Chr*_*gan 24

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

fn private_function() {
}

#[test]
fn test_private_function() {
    private_function()
}
Run Code Online (Sandbox Code Playgroud)

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

  • 绝对允许外部测试访问私有部分,因为1)您可能需要访问私有部分才能通过公共API可靠地触发所有代码路径.例如,可能存在内部阈值,当达到时会触发不同的代码路径.您可能还需要故障注入或内部详细信息来触发边缘情况.2)访问私有部分可以为测试失败提供更好的诊断 - 您可以将内部信息插入到恐慌消息等... (7认同)
  • 诊断:这就是std :: fmt :: Debug的用途。对于其他情况,我坚持我的立场,即外部测试不应访问私有详细信息。外部测试不适合您描述的情况,这就是内部单元测试的目的。 (2认同)
  • 在某些情况下,`fmt :: Debug`的粒度过于粗糙-例如,当您只需要特定的位时,您可能不希望打印有关整个庞大数据结构的详细信息。无论如何,内部测试还应该设置公共API的实际用例是否合适?如果没有,那是不会做的,因为我只需要这样做。如果是的话,那么我对所有这些和内部测试感到很高兴,尽管那时区别是毫无意义的?核心问题是,无论您多么努力,实现细节总是会以某种方式影响接口,没有解决之道。 (2认同)

Vul*_*rao 9

我不知道这个问题是否仍然对你开放,但我找到了一些关于它的文档:

测试组织

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

这是一个工作示例:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

总而言之,请记住,关于是否应该测试私有方法的争论在测试社区中仍然存在。双方都有有效的论点,正确的答案仅取决于您、您对测试程序的愿景以及您的项目背景。