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

C# Unit Testing - Ensure That Loop Continues Until Valid Input is Given

我有以下代码要求用户输入并继续询问直到他们提供有效输入。通过 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 一个接一个地发送输入?有什么不同的方法吗?

提前致谢

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

任何需要ui直接使用控制台的对象或多或少都将无法测试。您的流程只有一个控制台,重定向它会影响整个流程。

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

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

就通过 StringReader 传递多个输入而言,如果您使用的是 ReadLine,则只需使用 Environment.NewLine.

将多行放入字符串中