最初のRustプロジェクトのために私はおそらくそれを使用しているので、私はterminal
ビルダーパターンのメソッドをテストするためのきれいな方法を見つけることができないので、ユーザ入力を取得し答えを返します。Rustでユーザー入力が必要な関数を使用する関数をより洗練された方法でテストできますか?
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
を使用してユーザーに入力を促し機能のためのテストを書くことが許さdependency injection発見し解決策を探しています。私はQuestion::new("Continue?").confirm()
というテストごとに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);
}
これがある限り、私は単一スレッドのみでテストを実行するように動作していない、だけでなく、もはや私は本当のユーザーをテストすることができます入力機能。このような小さなクレートの問題ではありませんが、非常に面倒です。利用可能なテストライブラリからこれを行う方法はありませんでした。
*入力ごとに関数への入力を変更することはできません* - それが意味することを明確にすることはできますか? – Shepmaster
'reader'、' writer'、 'question'はすべて' confirm() '関数の中で' prompt_user() 'に渡されるので、' prompt_user() '関数をテストするときのように入力を操作できません自体。だから私は 'confirm()'を含むテストを自動化することができません。 –
それでは、引数を持たない 'confirm'は依存関係注入をサポートしていないと言っていますか?もしそうなら、私は私たちが何を手伝ってくれるか分かりません。はい、依存関係を注入する方法が必要ですが、引数は最も簡単ですが、構造体フィールドを持つこともできます。あなたが必要とする依存関係を注入するために 'confirm'の引数を持つことを妨げるものは何ですか? – Shepmaster