我寫了一個生命游戲控制臺應用程序,現在我正在為它編寫單元測試。游戲板以循環方式呈現,可以使用 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 關注
- 113 瀏覽
添加回答
舉報
0/150
提交
取消