У меня есть следующий код, который запрашивает у пользователя ввод и продолжает спрашивать, пока он не даст действительный ввод. Пользовательский ввод поступает через 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 ... ui.AskUserInput () прямо сейчас выполнит Console.ReadLine ... а ui.GetValidInputs () вернет массив строк, начинающийся с ["1", "2", «3»] и т. д. Я сделал это интерфейсом, потому что в будущем может появиться графический интерфейс.





Я не уверен в типе "ui". Однако, если бы это был я, я бы внедрил в объект, у которого был бы массив ответов, которые он будет отвечать на вызовы AskUserForInput, скажем, два, которые не проверяются, один, который проверяет, а затем четвертый, который также проверяет. Затем я вызываю ChooseMove и утверждаю, что получил третий элемент.
Любой объект, который требует прямого использования консоли, будет более или менее непроверен. Для вашего процесса есть только одна консоль, и ее перенаправление влияет на весь процесс.
Более тестируемая версия будет использовать TextReader, который вы передадите в нее, возможно, через конструктор. В реальном приложении инициализация может проходить в Console.In, но в свои тесты вы можете вставить StringReader или другой объект, который позволяет вам подделывать ввод.
Вы не показываете отношения между вашим игроком и объектами пользовательского интерфейса, но я предполагаю, что игрок создан с пользовательским интерфейсом для использования. Я бы дал объекту ui конструктор, который принимает TextReader, чтобы сделать его более тестируемым.
Что касается передачи нескольких входных данных через StringReader, если вы используете ReadLine, просто вставьте несколько строк в строку, используя Environment.NewLine.
Попробую, когда вернусь домой!
Это сработало для меня! Если позже кто-то придет с тем же вопросом, используя следующий код StringReader consoleInput = new StringReader("52" + Environment.NewLine + "8"); Console.SetIn(consoleInput);, я смог создать последовательный ввод. Первый вызов Console.ReadLine () вернул 52, а второй вызов Console.ReadLine () вернул 8.
что ты здесь ждешь
ui.GetValidInputs();