или его многопоточный аналог для хранения характеристик: внешние зависимости в любом случае медленнее по сравнению с временем ЦП, выделение дополнительной памяти и виртуальные вызовы едва ли будут заметны на радаре.
уCLI задает вопрос библиотеке для моего первого проекта Rust, так как я, вероятно, буду использовать его в любом случае, и я не могу найти чистый способ проверитьterminal
метод шаблона построения, который с помощью конфигурации получает пользовательский ввод и возвращает ответ.
pub fn confirm(&mut self) -> Answer {
self.yes_no();
self.build_prompt();
let prompt = self.prompt.clone();
let valid_responses = self.valid_responses.clone().unwrap();
loop {
let stdio = io::stdin();
let input = stdio.lock();
let output = io::stdout();
if let Ok(response) = prompt_user(input, output, &prompt) {
for key in valid_responses.keys() {
if *response.trim().to_lowercase() == *key {
return valid_responses.get(key).unwrap().clone();
}
}
self.build_clarification();
}
}
}
В поисках решения, которое я обнаружилвнедрение зависимости что позволило мне написать тесты для функции, которая предлагает пользователю ввод с помощьюCursor
, Это не позволяет мне изменить пользовательский ввод наconfirm()
функция для каждого тестаQuestion::new("Continue?").confirm()
хотя, поэтому я попытался использовать условную компиляцию, и придумал следующее.
#[cfg(not(test))]
fn prompt_user<R, W>(mut reader: R, mut writer: W, question: &str) -> Result<String, std::io::Error>
where
R: BufRead,
W: Write,
{
write!(&mut writer, "{}", question)?;
let mut s = String::new();
reader.read_line(&mut s)?;
Ok(s)
}
#[cfg(test)]
fn prompt_user<R, W>(mut reader: R, mut writer: W, question: &str) -> Result<String, std::io::Error>
where
R: BufRead,
W: Write,
{
use tests;
Ok(unsafe { tests::test_response.to_string() })
}
И вtests
Модуль Я использую глобальную переменную:
pub static mut test_response: &str = "";
#[test]
fn simple_confirm() {
unsafe { test_response = "y" };
let answer = Question::new("Continue?").confirm();
assert_eq!(Answer::YES, answer);
}
Это работает до тех пор, пока я запускаю тесты только с одним потоком, но также не позволяет мне проверять реальную функцию пользовательского ввода. Не такая уж проблема для такого маленького ящика, но он очень грязный. Я не видел никаких решений для этого из каких-либо доступных библиотек тестирования.