我写了一个生命游戏控制台应用程序,现在我正在为它编写单元测试。游戏板以循环方式呈现,可以使用 Esc 键中断。但是我不知道如何在我的主应用程序类的测试方法中模拟该按键,所以我的测试当前无限循环。应用.cspublic class Application{ private readonly IGame _game; private readonly IBoard _board; private readonly IBoardGenerator _boardGenerator; private readonly IConsole _console; public Application(IGame game, IBoard board, IBoardGenerator boardGenerator, IConsole console) { _game = game; _board = board; _boardGenerator = boardGenerator; _console = console; } public void Run() { void RenderBoard() { _console.Clear(); _board.Evolve(); _board.Print(); Thread.Sleep(150); } LoopUntilButtonPressed(() => { _console.Clear(); _game.NewGame(); _game.SetBoard(_board, _boardGenerator); LoopUntilButtonPressed(RenderBoard, ConsoleKey.Escape); }, ConsoleKey.Escape); } private void LoopUntilButtonPressed(Action action, ConsoleKey consoleKey) { do { while (!_console.KeyAvailable) { action.Invoke(); } } while (_console.ReadKey(true) != consoleKey); }
1 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
在控制台抽象上模拟ReadKey和成员。KeyAvailable
确保Setup发生在被测方法之前。在这种情况下是Run. 这样,模拟将在调用时按预期运行。
我还建议您设置一个序列,KeyAvailable以便在while.
[Test]
public void Run_MethodCalled_GameCorrectlySet() {
//Arrange
_fakeConsole.Setup(_ => _.ReadKey(It.IsAny<bool>())).Returns(ConsoleKey.Escape);
_fakeConsole.SetupSequence(_ => _.KeyAvailable)
.Returns(false) // will be returned on 1st invocation
.Returns(true); // will be returned on 2nd invocation to break while
//Act
_application.Run();
//Assert
_fakeGame.Verify(_ => _.NewGame(), Times.Once);
}
- 1 回答
- 0 关注
- 90 浏览
添加回答
举报
0/150
提交
取消