jak*_*ack 1 functional-programming scala for-comprehension reader-monad scala-cats
我有一个带有单元测试的无标签最终实现,当我运行单元测试时,仅第一步被调用,其余部分不被调用。
这是测试目标:
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))
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试是:
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
Run Code Online (Sandbox Code Playgroud)
我只看到ok1显示。
完整的代码在这里:https : //bitbucket.org/jameskingconsulting/scala-effects
尝试
new NameThing[Test]().program.run(TestEnv())
Run Code Online (Sandbox Code Playgroud)
new NameThing[Test]().program.run
只是一个TestEnv => Unit
(其中.run
是Kleisli
的run
),你应该把它在TestEnv
实际运行该程序。