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

时间:2018-07-16 02:28:47

标签: c# unit-testing nunit console-application

我有以下代码,要求用户输入并继续询问,直到他们提供有效输入为止。通过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发送一个输入?我应该采取其他方法吗?

预先感谢

2 个答案:

答案 0 :(得分:1)

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

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

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

就通过StringReader传递多个输入而言,如果使用的是ReadLine,则只需使用Environment.NewLine在字符串中放入多行即可。

答案 1 :(得分:0)

我不确定“ ui”的类型。但是,如果是我,我将插入一个对象,该对象将具有一系列响应,这些响应将响应对AskUserForInput的调用,例如两个未验证,一个进行验证,然后是第四个也进行验证的响应。然后我打电话给ChooseMove,并断言我得到了第三项。