C#单元测试-确保循环继续,直到给出有效输入



我有下面的代码,要求用户输入并继续询问,直到他们给出有效的输入。用户输入通过控制台接收。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发送一个又一个输入?我应该用另一种方式来做这件事吗?

提前感谢

任何需要直接使用控制台的对象都或多或少是不稳定的。您的进程只有一个控制台,重定向它会影响整个进程。

一个更可测试的版本将使用一个TextReader,您可以通过构造函数将其传递给它。在实际应用程序中,初始化可以在Console中进行。在中,但在测试中,您可以注入StringReader或其他允许伪造输入的对象。

你没有显示你的播放器和ui对象之间的关系,但我假设播放器是用一个ui创建的。我会给ui对象一个带有TextReader的构造函数,以便使其更易于测试。

就通过StringReader传递多个输入而言,如果使用ReadLine,那么只需使用Environment.NewLine将多行输入字符串即可。

我不确定"ui"的类型。然而,如果是我,我会注入一个对象,该对象将有一组答案,它将响应对AskUserForInput的调用,比如两个不验证,一个验证,然后是第四个也验证的答案。然后我调用ChooseMove,并断言我得到了第三个项。

最新更新