#rust
Вопрос:
У меня есть приложение, которое вызывает функцию, которая, в конце концов, имеет часть логики, для запуска которой требуется некоторое время. Я уже тестирую эту логику самостоятельно, так как это ее собственная функция, но в настоящее время мои тесты занимают гораздо больше времени, чем мне бы хотелось.
Есть ли способ заставить длительно работающую функцию работать при обычном использовании, но не при тестировании hello_world
функции?
fn main() {
hello_world();
}
fn hello_world() {
println!("Hello, world!");
// Can I ignore this when testing?
long_running_function();
}
fn long_running_function() {
for i in 1..100000 {
println!("{}", i);
}
}
#[test]
fn hello_world_test() {
hello_world();
}
Ответ №1:
Вы можете использовать #[cfg(not(test))]
:
#[cfg(not(test))]
long_running_function();
Или макроэквивалент:
if !cfg!(test) {
long_running_function();
}
Общий подход в модульном тестировании заключается в том, чтобы имитировать внешние функции, можно предоставить две отдельные реализации long_running_function
в зависимости от того, скомпилирована ли она для тестирования или целевой.
#[cfg(not(test))]
fn long_running_function() {
for i in 1..100000 {
println!("{}", i);
}
}
#[cfg(test)]
fn long_running_function() {
// not so long code
}
В противном случае вы всегда можете передать логическое значение hello_world()
и создать условие на основе этого логического значения.
Комментарии:
1.
#[cfg(not(test))]
обведите определениеlongfunction
и напишите альтернативный макет для тестирования. Я думаю, что это чище, чем иметь макрос вокруг вызова.2. @Simson хорошая мысль! Я добавлю это к ответу