对于理解不完全使用Reader进行单元测试的步骤

时间:2019-06-09 13:56:37

标签: scala functional-programming scala-cats for-comprehension reader-monad

我有一个带有单元测试的无标签最终实现,当我运行单元测试时,仅第一步被调用,其余部分未被调用。

这是测试目标:

class NameThing[F[_]: Monad](implicit console: Console[F]) {

  def program: F[Unit] = for {
    _ <- console.prompt
    rawName <- console.read
    fullName = parse(rawName)
    _ <- console.display(fullName)
  } yield ()

  def parse(rawName:String):FullName = {
    val parts = rawName.split(" ")
    FullName(parts(0), parts(1))
  }
}

单元测试是:

implicit object TestConsole extends Console[Test] {
      override def prompt: Test[Unit] = {
        println("ok1")
        Reader(TestEnv => TestEnv.prompt)
      }
      override def read: Test[String] =  {
        println("ok2")
        Reader(TestEnv => TestEnv.read)
      }
      override def display(fullName: FullName): Test[Unit] = {
        println("ok3")
        Reader(TestEnv => TestEnv.display(fullName.toString))
      }
    }

    val result = new NameThing[Test]().program.run

我只看到显示的ok1。

在此处填写代码:https://bitbucket.org/jameskingconsulting/scala-effects

1 个答案:

答案 0 :(得分:5)

尝试

new NameThing[Test]().program.run(TestEnv())

new NameThing[Test]().program.run只是一个TestEnv => Unit(其中.runKleisli的{​​{1}}),您应该在run上调用它来实际运行程序。