我有以下代码,要求用户输入并继续询问,直到他们提供有效输入为止。通过Console.ReadLine
接收用户输入public int ChooseMove() {
string input;
do {
input = ui.AskUserForInput();
} while (!ValidateInput(input));
return int.Parse(input);
}
private bool ValidateInput(string input) {
string [] positions = ui.GetValidInputs();
if (Array.Exists(positions, position => position == input)) {
return true;
}
return false;
}
我正在尝试对ChooseMove方法进行单元测试,但是我被困住了。
我在NUnit中有一个基本案例,像这样...
[Test]
public void TestValidMove() {
StringReader consoleInput = new StringReader("6");
Console.SetIn(consoleInput);
Assert.That(player.ChooseMove(), Is.EqualTo(6));
}
但是,我不知道如何测试用户是否输入了错误的信息,并一直持续到给出有效的输入为止。
我想向输入流发送“ 52”,然后第二次发送“ 6”。如何使用StringReader发送一个输入?我应该采取其他方法吗?
预先感谢
答案 0 :(得分:1)
任何需要直接使用控制台的对象将或多或少不可测试。您的过程只有一个控制台,重定向它会影响整个过程。
可测试性更高的版本可能会使用TextReader
,您可能会通过构造函数将其传递给它。在实际的应用程序中,初始化可以在Console中传递。在测试中,您可以注入StringReader
或其他可以伪造输入的对象。
您没有显示播放器和ui对象之间的关系,但是我假设播放器是使用ui创建的。我会给ui对象一个构造函数,该构造函数采用TextReader,以使其更具可测试性。
就通过StringReader
传递多个输入而言,如果使用的是ReadLine,则只需使用Environment.NewLine
在字符串中放入多行即可。
答案 1 :(得分:0)
我不确定“ ui”的类型。但是,如果是我,我将插入一个对象,该对象将具有一系列响应,这些响应将响应对AskUserForInput的调用,例如两个未验证,一个进行验证,然后是第四个也进行验证的响应。然后我打电话给ChooseMove,并断言我得到了第三项。