如何在 Scala 测试中检查“任一”结果?

Han*_*nes 6 scala scalatest

我对 Scala 测试比较陌生,因此我查阅了有关如何测试值的文档Either

我试图复制这样的指令:

import org.scalatest.EitherValues
import org.scalatest.flatspec.AnyFlatSpec

class EitherTest extends AnyFlatSpec with EitherValues {
  val either: Either[Exception, Int] = Right(42)

  either.right.value should be > 1
}
Run Code Online (Sandbox Code Playgroud)

这个实现没有用,我收到一个语法错误。我做错了什么?

错误:

错误:(9, 22) 值不应该是 Int 的成员。right.value 应该 > 1 错误:(9, 29) not found: value be another.right.value 应该是 > 1 – Hannes 14 小时前

Yur*_*kha 6

通过与模式匹配来测试Either可以更具可读性。ScalaTest 的Inside特征允许您在模式匹配后做出断言。

import org.scalatest.Inside
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class EitherTest extends AnyFlatSpec with Inside with Matchers {
  val either: Either[Exception, Int] = Right(42)

  either should matchPattern { case Right(42) => }

  inside(either) { case Right(n) =>
    n should be > 1
  }

  val either2: Either[Exception, Int] = Left(new Exception("Bad argument"))

  inside(either2) { case Left(e) =>
    e.getMessage should startWith ("Bad")
  }

}
Run Code Online (Sandbox Code Playgroud)


Mar*_*lic 5

有一个开放的拉取请求Add EachValuable #1712旨在解决在 Scala 2.13 中RightProjection弃用的事实:

目前.right已弃用(我相信它会保持这种状态)但.left不是,根据scala/scala#8012

的新语法EitherValues在将来的版本ScalaTest可能变得rightValueleftValue喜欢这样

either.rightValue should be > 1
Run Code Online (Sandbox Code Playgroud)


pme*_*pme 4

我将这样做。

先检查是否正确,然后比较值:

either.isRight shouldBe true
either.getOrElse(0) shouldBe 42
Run Code Online (Sandbox Code Playgroud)

另一种方法是如果不正确则失败:

either.getOrElse(fail("either was not Right!")) shouldBe 42
Run Code Online (Sandbox Code Playgroud)

我还会包装您的测试,例如WordSpec

"My Either" should {
  "be Right" in {
    either.getOrElse(fail("either was not Right!")) shouldBe 42
  }
}
Run Code Online (Sandbox Code Playgroud)

这会提示您问题出在哪里。否则,如果失败,您得到的只是一个令人讨厌的错误堆栈。

这是整个例子:

class EitherTest
  extends WordSpec
  with Matchers
  with EitherValues {

  // val either: Either[Exception, Int] = Right(42)
  val either: Either[Exception, Int] = Left(new IllegalArgumentException)
  "My Either" should {
    "be Right" in {
      either.getOrElse(fail("either was not Right!")) shouldBe 42
    }
  }
}
Run Code Online (Sandbox Code Playgroud)