繁体   English   中英

单元测试 IO Scala

[英]Unit Testing IO Scala

我正在使用 scalatest 在 scala 中开始单元测试。 我正在测试的方法如下:

 def readAlpha: IO[Float] = IO {
    val alpha = scala.io.StdIn.readFloat()
    alpha
  }

该测试包括将用户插入的浮点数限制为两位小数这是我尝试过的,但似乎不起作用。 我怎么能修好它

  "alpha" should " have two decimal numbers after comma" in {
    val alpha = readAlpha
    //assert(alpha == (f"$alpha%.2f"))
  }

我不能说你做错了,但你不能将效果类型与纯类型进行比较。 并且不可能为控制台输入应用程序编写直接测试。 首先你应该以某种方式模拟readAlpha方法,然后你应该评估值,然后,可以比较它们。 这是一个小演示:

import cats.effect.IO

class ConsoleIO {
  def readAlpha: IO[Float] = IO {
    val alpha = scala.io.StdIn.readFloat()
    alpha
  }
}
// ---------------------------------

import cats.effect.{ContextShift, IO, Timer}
import org.scalatest.funsuite.AsyncFunSuite
import scala.concurrent.ExecutionContext

class ConsoleIOTest extends AsyncFunSuite {

  class MockConsole extends ConsoleIO {
    override def readAlpha: IO[Float] = IO.pure(2.23f)
  }
  implicit val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global)
  implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global)
  test("alpha should have two decimal numbers after comma") {
    val consoleIO = new MockConsole
    val alpha = consoleIO.readAlpha.unsafeRunSync()
    assert(alpha.toString === (f"$alpha%.2f"))
  }

}

这里unsafeRunSync()通过将封装的效果作为不纯运行来产生结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM