【问题标题】:test a scala function with Unit return type测试具有 Unit 返回类型的 scala 函数
【发布时间】:2020-12-21 13:02:26
【问题描述】:

是否可以使用 Scala 测试来测试 Unit 返回类型的函数? 如果是,请给我答案 我需要更高的代码覆盖率。

【问题讨论】:

  • 从技术上讲,您可以使用 someFunction() == () 来实现,但它与 { someFunction(); true } 一样有意义。
  • 函数有什么作用,你想测试什么?
  • 你不能(轻松地)测试它,你也不应该这样做。如果该功能仅打印,则不需要单元测试。如果该功能不仅仅用于打印,则将该功能一分为二并测试产生和输出的功能。 - 如果你真的想测试打印的内容,你需要注入一个不同的输出流来比较它的内容。
  • 再一次,你不应该测试它。您的业​​务逻辑不应填充输入/输出。您的逻辑应该只接收它需要的所有参数并返回每个输出。另一个函数 (不会被测试) 将负责执行 IO 并使用逻辑调用该函数。

标签: scala scalatest


【解决方案1】:

返回 Unit 的函数可能具有副作用,因此您需要测试副作用。

【讨论】:

  • 我想测试它是否在屏幕上打印了一些东西
【解决方案2】:

以下测试断言HelloWorld 正在控制台上打印。


type ConsoleErrors  = List[String]
type ConsoleOutputs = List[String]
test("should print hello world to console") {

  def toString(arr: Array[Byte]): List[String] = new String(arr).split("\n").toList.filter(!_.isEmpty)

  def captureConsole[T](f: => T): (T, ConsoleOutputs, ConsoleErrors) = {
    val outCapture = new ByteArrayOutputStream
    val errCapture = new ByteArrayOutputStream
    try {
      val t                   = Console.withOut(outCapture)(Console.withErr(errCapture)(f))
      val out: ConsoleOutputs = toString(outCapture.toByteArray)
      val errs: ConsoleErrors = toString(errCapture.toByteArray)
      (t, out, errs)
    }
    finally {
      outCapture.reset()
      errCapture.reset()
    }
  }

  val (_, out, errs) = captureConsole {
    println("Hello")
    println("World")
  }

  out shouldBe List("Hello", "World")
  errs shouldBe List.empty
}

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2014-05-29
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多