如何在Rust中测试私有方法? 我没有找到任何相关信息。文档中也没有相关信息。
#[test]
时,私有方法和公有方法并没有什么特别之处 - 你只是编写可以访问其能够访问的任何内容的完全正常的函数。fn private_function() {
}
#[test]
fn test_private_function() {
private_function()
}
如果您正在使用Cargo,则外部测试(例如tests/*.rs
和examples/*.rs
)或文档测试不会访问私有成员;它们也不应该:这些测试旨在成为公共 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));
}
}
warning: function is never used:
internal_adder``,但是internal_adder
函数在internal
函数中被调用。这是因为测试代码是死代码吗?我没有找到任何描述这个问题的文档。我知道添加pub
将消除此警告,这与其他编程语言中的export
有些相似。 - libyimpl MyStruct {
fn new() -> Self { ... }
fn my_priv_method1(&self, x) -> u8 { ... }
pub fn self_test_private_methods() {
assert(self.my_priv_method(1) == 2);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn internal() {
MyStruct::new().self_test_private_methods()
}
}
std::fmt::Debug
的作用。至于其他方面,我坚持我的立场,即外部测试不应该访问私有细节。外部测试并不适合您所描述的情况——这就是内部单元测试的作用。 - Chris Morganfmt::Debug
过于粗略 - 例如,当您只想获取特定位时,可能不希望打印有关整个大型数据结构的细节。无论如何,是否适合在内部测试中设置公共API的实际用例?如果不行,那行不通,因为我需要这样做。如果可以,那么好吧,我很高兴将其称为内部测试,尽管此时区分有点无意义?核心问题在于,无论您如何努力,实现细节总会以某种方式影响接口,这是无法避免的。 - kralyk.len()
。然而,对于测试,我希望查询.len()
,因为我可能会放入一些数据,并希望检查它是否存在。 - FreelanceConsultant