用于 Validated 和 ValidatedNel 的 Specs2 匹配器
Specs2 Matchers for Validated and ValidatedNel
我没有找到 cats
的 ValidatedNel
的 specs2
匹配器,所以我正在编写这样的匹配器:
import cats.data._
import cats.implicits._
import org.specs2.matcher.Matcher
type ValidationFailure = String
type ValidationResult[A] = ValidatedNel[ValidationFailure, A]
def beValid: Matcher[ValidationResult[_]] =
beTrue ^^ ((_: ValidationResult[_]).isValid)
def beInvalid(failure: ValidationFailure): Matcher[ValidationResult[_]] =
beEqualTo(failure.invalidNel)
def beInvalid[A: Monoid](failures: ValidationFailure*): Matcher[ValidationResult[A]] =
beEqualTo(failures.toList foldMap (_.invalidNel[A]))
有意义吗?您建议如何改进它?
我认为从其他匹配器派生匹配器很好,因为它可以让您快速获胜。但是,失败消息可能不是很好。例如,beValid
匹配器将失败,告诉您某个值不是 true
。所以我建议这样写:
def beValid: Matcher[ValidationResult[_]] = { actual: ValidationResult[_] =>
(actual.isValid, s"$actual is not valid")
}
如果您有时间,也将不胜感激 specs2-cats 模块中的 PR :-)。
我没有找到 cats
的 ValidatedNel
的 specs2
匹配器,所以我正在编写这样的匹配器:
import cats.data._
import cats.implicits._
import org.specs2.matcher.Matcher
type ValidationFailure = String
type ValidationResult[A] = ValidatedNel[ValidationFailure, A]
def beValid: Matcher[ValidationResult[_]] =
beTrue ^^ ((_: ValidationResult[_]).isValid)
def beInvalid(failure: ValidationFailure): Matcher[ValidationResult[_]] =
beEqualTo(failure.invalidNel)
def beInvalid[A: Monoid](failures: ValidationFailure*): Matcher[ValidationResult[A]] =
beEqualTo(failures.toList foldMap (_.invalidNel[A]))
有意义吗?您建议如何改进它?
我认为从其他匹配器派生匹配器很好,因为它可以让您快速获胜。但是,失败消息可能不是很好。例如,beValid
匹配器将失败,告诉您某个值不是 true
。所以我建议这样写:
def beValid: Matcher[ValidationResult[_]] = { actual: ValidationResult[_] =>
(actual.isValid, s"$actual is not valid")
}
如果您有时间,也将不胜感激 specs2-cats 模块中的 PR :-)。