使用 ZIO2 和 zio-test 断言效果失败

1 scala zio zio-test

我是 Scala / ZIO 2 世界的初学者,我正在尝试为一个简单的服务编写一些测试。

所以我有这个方法:

def validate(id: String): ZIO[Any, Throwable, Unit] = {
  if (id == "invalid-id") {
    ZIO.fail("Invalid id")
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了几件事,但主要是尝试使用isFailurefails断言:

 suite("My suite")(
    test("When id is valid") { // This passes
      for {
        result <- validate("valid-id")
      } yield assertTrue(result == ())
    },
    test("when id is not valid") { 
      for {
        result <- validate("invalid-id")
      } yield assertTrue(isFailure(result)) // This doesn't even compile
    }
  )
Run Code Online (Sandbox Code Playgroud)

如何测试效果失败的情况?

我在用:

Scala: "3.2.1"
zio: "2.0.4"
zio-test: "2.0.5"
Run Code Online (Sandbox Code Playgroud)

zag*_*gyi 5

有多种方法可以断言效果失败。ZIO#exit下面的示例演示了和的用法ZIO#flip

import zio._
import zio.test._

object MySpec extends ZIOSpecDefault {

  def validate(id: String): ZIO[Any, String, Unit] =
    ZIO.cond(id != "invalid-id", (), "Invalid id")

  def spec =
    suite("My suite")(

      test("when id is not valid 1") {
        for {
          result <- validate("invalid-id").exit
        } yield assertTrue(
          result == Exit.fail("Invalid id")
        )
      },

      test("when id is not valid 2") {
        for {
          result <- validate("invalid-id").flip
        } yield assertTrue(
          result == "Invalid id"
        )
      }
    )
}
Run Code Online (Sandbox Code Playgroud)