我对 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 小时前
通过与模式匹配来测试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)
有一个开放的拉取请求Add EachValuable #1712旨在解决在 Scala 2.13 中RightProjection已弃用的事实:
目前
.right已弃用(我相信它会保持这种状态)但.left不是,根据scala/scala#8012
的新语法EitherValues在将来的版本ScalaTest可能变得rightValue和leftValue喜欢这样
either.rightValue should be > 1
Run Code Online (Sandbox Code Playgroud)
我将这样做。
先检查是否正确,然后比较值:
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)