如何测试scalaz IO?

时间:2015-05-08 06:58:53

标签: scala io sbt scalaz specs2

考虑以下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?

2 个答案:

答案 0 :(得分:4)

对于这种交互,我认为值得使用Free monads开发一种“迷你语言”,并且有2个解释器,一个用于使用Id Monad进行测试,另一个用于使用{{}进行生产{1}} monad。

答案 1 :(得分:1)

来自&#34;分叉&#34;中的Configuring Input文档部分:

  

默认情况下,sbt进程的标准输入不会转发到分叉进程。要启用此功能,请配置connectInput设置:

     

connectInput in run := true