簡體   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