单元测试控制台输入和随机数

本文关键字:随机数 输入 控制台 单元测试 | 更新日期: 2023-09-27 17:58:33

我有一个回合制游戏的逻辑模块(还没有UI),它使用异步用户输入(从控制台解析,直到完成真正的UI),在某些情况下生成随机数("骰子"),并根据输入和随机数更改游戏状态模型。

阅读这条线索和这条线索,我想知道是否有可能使用类似的东西。我的游戏逻辑只有一个Random实例,所以交换它应该相对容易。

那我该怎么办

  • 将GameLogic.Rrandom换成IRandom,并根据我是否在测试将Random或预生成的序列放入其中
  • 在我的命令解析器中,将Console.ReadLine()与IConsole.ReadLine()交换到各处,这样我就不必每次都键入它
  • 将Console.WriteLine()与IConsole.WriteLine()交换,这样它就可以打印到一个文件中,在那里我可以读取结果

然后我就可以使用单元测试中的类了?仅此而已??

单元测试控制台输入和随机数

是的,仅此而已,但如果你不想,你甚至不必这么做。

您不必创建接口IConsole,因为在某种程度上,它已经存在。您可以将TextReader用于输入,将TextWriter用于输出。在实际应用程序中,您可以传入Console.InConsole.Out。在测试中,您可以使用StringReaderStringWriter

如果您不想自己提供数字,也不必创建IRandom,初始化为常量种子的Random就足够了。

总之:是的。不过,最好让IConsole.WriteLine()的mock实现将其给定的值保存到一组字符串中,您可以从mock中读回,而不必麻烦地写入磁盘上的文件,然后定位并读回该文件。