考虑以下IO:
val io = (for{
userChoice <- getChar
} yield if (userChoice == 'y') putStr("yes") else putStr("no")).flatMap(identity)
我试图像这样测试它:
val input: InputStream = new ByteArrayInputStream(Array('n', 'n')) // Not sure why I need two of them...
System.setIn(input)
val output = new ByteArrayOutputStream()
System.setOut(new java.io.PrintStream(output))
io.unsafePerformIO()
System.setIn(new FileInputStream(FileDescriptor.in))
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)))
output.toString ==== "no"
我在sbt中使用specs2进行测试。我第一次运行测试时,它会通过。第二次失败并且Console has reached end of input
和sbt处于奇怪的状态,我需要杀死它。
我想可能会与某些人进行某种互动,但我不明白它到底是什么。有没有更好的方法来测试IO?
答案 0 :(得分:4)
对于这种交互,我认为值得使用Free monads开发一种“迷你语言”,并且有2个解释器,一个用于使用Id
Monad进行测试,另一个用于使用{{}进行生产{1}} monad。
答案 1 :(得分:1)
来自&#34;分叉&#34;中的Configuring Input文档部分:
默认情况下,sbt进程的标准输入不会转发到分叉进程。要启用此功能,请配置connectInput设置:
connectInput in run := true