如何在ZIO-Test中断言ZIO内String或提升普通String至ZIO?
ZIO-Test 校验ZIO字符串与普通字符串的两种实现
方式一:直接断言普通字符串与ZIO内部的字符串
利用ZIO-Test提供的assertM方法,直接对ZIO实例的执行结果进行断言,和普通字符串做匹配:
import zio._ import zio.test._ import zio.test.Assertion._ // 示例中的目标ZIO实例 val targetZio: ZIO[Transactor[Task], Serializable, String] = ??? // 需要对比的普通字符串 val expectedStr: String = "你期望的字符串内容" // 测试用例 test("直接校验ZIO输出与普通字符串") { assertM(targetZio)(equalTo(expectedStr)) }
assertM会自动运行传入的ZIO实例,提取其成功结果后,用equalTo(expectedStr)验证两者是否完全一致。
方式二:将普通字符串提升为同类型ZIO后断言
先把普通字符串包装成和目标ZIO环境、错误类型完全一致的ZIO实例,再通过断言两个ZIO的输出是否一致完成校验:
import zio._ import zio.test._ import zio.test.Assertion._ val targetZio: ZIO[Transactor[Task], Serializable, String] = ??? val expectedStr: String = "你期望的字符串内容" // 把普通字符串提升为同类型ZIO:错误类型自动兼容(Nothing是Serializable的子类) val expectedZio: ZIO[Transactor[Task], Serializable, String] = ZIO.succeed(expectedStr) // 测试用例1:用equalToZIO直接对比两个ZIO的输出 test("提升普通字符串后校验ZIO输出") { assertM(targetZio)(equalToZIO(expectedZio)) } // 测试用例2:合并两个ZIO后对比结果 test("合并ZIO后校验结果一致性") { assertM( targetZio.zip(expectedZio).map { case (actual, expected) => actual == expected } )(isTrue) }
两种子方式都能实现需求:equalToZIO专门用于断言两个ZIO实例的输出相等;zip合并后对比的方式则更灵活,适合需要自定义对比逻辑的场景。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

