如何在Scalatestplus ScalaCheck中避免unsafeRunSync测试Effectful API?
解决Effectful API测试无需手动调用
unsafeRunSync的方案 你可以借助cats-effect-testing-scalatest库实现让测试框架自动处理Effectful代码,无需手动调用unsafeRunSync。
步骤1:引入依赖
在你的sbt构建文件中添加测试依赖(版本可根据cats-effect版本调整,适配cats-effect 3.x的推荐版本如下):
libraryDependencies += "org.typelevel" %% "cats-effect-testing-scalatest" % "1.5.0" % Test
步骤2:修改测试类
让测试类扩展CatsEffect特质,该特质会为Scalatest添加对cats-effect F[_]类型的支持,自动处理效果的运行:
class SampleAsyncWordSpec extends wordspec.AnyWordSpec with org.scalatestplus.scalacheck.ScalaCheckPropertyChecks with cats.effect.testing.scalatest.CatsEffect { // 添加该特质 import util._ import cats.effect.IO "String reverser[F] with property based tests" must { "satisfy consistency with length in original and reversed string" in { forAll {(s: String) => // 直接返回IO[Assertion],框架会自动运行效果并验证断言 stringReverserF[IO](s).map(r => assert(s.length == r.length)) } } } }
原理说明
cats-effect-testing-scalatest提供的CatsEffect特质,重载了Scalatest的测试执行逻辑,能够识别返回F[Assertion]的测试代码,自动调用cats-effect的运行时执行效果,无需手动调用unsafeRunSync或类似方法。
这个方案完全适配你提到的无标签最终代数场景,只要你的代数基于cats-effect的Sync/Async类型约束,就能无缝集成到测试中。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

