强烈意见提醒:你的测试做错了。这与“如何测试私有方法”处于同一级别。你不应该关心的实施registration
达到这种详细程度。
话虽这么说,如果知道哪个确实很重要if
采取分支,然后使用依赖注入:
fn registration(mut registration: impl Registration, registrar: i32) {
let num_of_students = 0;
let student_limit = 0;
if num_of_students < student_limit {
registration.function_one(registrar, num_of_students);
} else {
registration.function_two(num_of_students);
}
}
trait Registration {
fn function_one(&mut self, registrar: i32, num_of_students: i32);
fn function_two(&mut self, num_of_students: i32);
}
impl<R: Registration> Registration for &'_ mut R {
fn function_one(&mut self, registrar: i32, num_of_students: i32) {
(**self).function_one(registrar, num_of_students)
}
fn function_two(&mut self, num_of_students: i32) {
(**self).function_two(num_of_students)
}
}
/*
// An example implementation for production
struct DatabaseRegistration;
impl Registration for DatabaseRegistration {
fn function_one(&mut self, registrar: i32, num_of_students: i32) {
eprintln!("Do DB work: {}, {}", registrar, num_of_students)
}
fn function_two(&mut self, num_of_students: i32) {
eprintln!("Do DB work: {}", num_of_students)
}
}
*/
#[cfg(test)]
mod test {
use super::*;
#[derive(Debug, Copy, Clone, Default)]
struct TestRegistration {
calls_to_one: usize,
calls_to_two: usize,
}
impl Registration for TestRegistration {
fn function_one(&mut self, _: i32, _: i32) {
self.calls_to_one += 1;
}
fn function_two(&mut self, _: i32) {
self.calls_to_two += 1;
}
}
#[test]
fn calls_the_right_one() {
let mut reg = TestRegistration::default();
registration(&mut reg, 42);
assert_eq!(1, reg.calls_to_two)
}
}
完成此操作后,您可以看到registration
调用适当的特征函数(如示例测试所示)。
这可以防止您的生产代码散布特定于测试的碎屑,同时还使您能够更加灵活并快速测试更多案例。
也可以看看:
- 如何测试标准输入和标准输出?
- 如何在测试中模拟外部依赖项?
- 在 Rust 中,是否有一种更简洁的方法来测试使用需要用户输入的函数的函数?
- 如何测试依赖于环境变量的 Rust 方法?
- 有没有办法检测 Rust 中的测试是否调用了代码?