или его многопоточный аналог для хранения характеристик: внешние зависимости в любом случае медленнее по сравнению с временем ЦП, выделение дополнительной памяти и виртуальные вызовы едва ли будут заметны на радаре.

у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);
}

Это работает до тех пор, пока я запускаю тесты только с одним потоком, но также не позволяет мне проверять реальную функцию пользовательского ввода. Не такая уж проблема для такого маленького ящика, но он очень грязный. Я не видел никаких решений для этого из каких-либо доступных библиотек тестирования.

Ответы на вопрос(1)

Ваш ответ на вопрос