関数の単体テストの方法がわかりません。ユーザーが入力したものの代わりにアスタリスクが表示されるように、ユーザー入力のパスワード スタイルを取得するために使用されます。そのため、コンソール I/O をキャプチャして、期待値と比較しようとしています。
これは機能です:
public string getMaskedInput(string prompt)
{
string pwd = "";
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter)
{
pwd = pwd += key.KeyChar;
Console.Write("*");
}
else
{
if (key.Key == ConsoleKey.Backspace && pwd.Length > 0)
{
pwd = pwd.Substring(0, pwd.Length - 1);
Console.Write("\b \b");
}
}
}
while (key.Key != ConsoleKey.Enter);
return pwd;
}
そしてテスト:
public void getInputTest()
{
//arrange
var sr = new StringReader("a secret");
var sw = new StringWriter();
Console.SetOut(sw);
Console.SetIn(sr);
Input i = new Input();
string prompt="what are you typing? ";
//act
string result = i.getMaskedInput(prompt);
//assert
var writeResult = sw.ToString();
Assert.IsTrue((writeResult == "what are you typing? ")&&(result=="a secret"));
編集: 単体テストを再確認したところ、バグがありました。修正したので、テストがハングします。テストをステップ実行すると、 と関係があることが示されますがConsole.ReadKey()
、これはリダイレクトできないと思われStreamReader()
ますReadLine()
。
また、これは同じテストで 2 つのアサートのようですが、この関数をテストする正しい方法ですか?