给定的代数数据类型
sealed trait Result
case object Success extends Result
case class MyFailure(details: String) extends Result如何在zio-test中断言特定的值是一个Failure,并且它的详细信息包含特定的子字符串?
例如,如何使用"mana"子字符串来断言下面的r是失败的?
val r: Result = MyFailure("not enough mana")发布于 2021-04-10 04:31:23
假设结果是由一个效果产生的(换句话说,它是由ZIO包装的),您可以使用mapError在失败的情况下使用details,然后使用assertM和fails(containsString)有效地断言
testM("effectfully") {
val r = ZIO.fail(MyFailure("not enough mana")).mapError(_.details)
assertM(r.run)(fails(containsString("mana")))
}发布于 2021-04-10 04:53:07
使用isCase是可能的
截图:
/**
* Makes a new assertion that requires the sum type be a specified term.
*
* {{{
* isCase("Some", Some.unapply, anything)
* }}}
*/
def isCase[Sum, Proj](
termName: String,
term: Sum => Option[Proj],
assertion: Assertion[Proj]
)我的解决方案(可能并不理想)是:
sealed trait Result
case object Success extends Result
case class MyFailure(details: String) extends Result
val r: Result = MyFailure("not enought mana")
test("mana") {
assert(r)(
isCase[Result, String](
"details",
{
case MyFailure(details) => Some(details)
case _ => None
},
containsString("mana"))
)
}或者,也可以创建一个helper函数,并将其用于以下情况:
def matches[A](mf: PartialFunction[A, Boolean]): Assertion[A] =
Assertion.assertion("matches")() {
a => mf.orElse[A, Boolean]({ case _ => false })(a)
}现在,测试可能如下所示:
assert(r)(
matches {
case MyFailure(d) => d.contains("mana")
}
)https://stackoverflow.com/questions/67027688
复制相似问题