单元测试 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()
产生的结果是运行封装的效果不纯。
我正在使用 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()
产生的结果是运行封装的效果不纯。