单元测试控制台输入和随机数
本文关键字:随机数 输入 控制台 单元测试 | 更新日期: 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.In
和Console.Out
。在测试中,您可以使用StringReader
和StringWriter
。
如果您不想自己提供数字,也不必创建IRandom
,初始化为常量种子的Random
就足够了。
总之:是的。不过,最好让IConsole.WriteLine()
的mock实现将其给定的值保存到一组字符串中,您可以从mock中读回,而不必麻烦地写入磁盘上的文件,然后定位并读回该文件。