У меня есть функция, которая принимает замыкание для выполнения логики, связанной с выводом (например, отображение на стандартный вывод):
fn handle(mut output: impl FnMut(String) -> ()) -> Result<(), String> {
// do something that produces output string `message`
let message = "example".to_string();
Ok(output(message))
}
Я пытаюсь написать интеграционный тест для этой функции, где я определяю функцию вывода заглушки, которая сохраняет строку вывода в локальную переменную:
#[test]
fn should_work() {
let mut output_message = String::from("");
let output = |message: String| {
output_message = message;
};
let result = handle(output);
assert!(result.is_ok());
assert_eq!("blah", output_message);
}
Однако у меня есть ошибка:
error[E0502]: cannot borrow `output_message` as immutable because it is also borrowed as mutable
--> src/lib.rs:18:24
|
11 | let output = |message: String| {
| ----------------- mutable borrow occurs here
12 | output_message = message;
| -------------- previous borrow occurs due to use of `output_message` in closure
...
18 | assert_eq!("blah", output_message);
| ^^^^^^^^^^^^^^ immutable borrow occurs here
19 | }
| - mutable borrow ends here
Можно ли как-нибудь протестировать, используя этот подход? Я кратко искал несколько поддельных ящиков, но все ящики, кажется, не обновляются очень часто, и они все равно немного излишни для моего сценария.
Если нет, есть ли лучшая альтернатива для тестирования этой функции?