[英]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.