用于 Validated 和 ValidatedNel 的 Specs2 匹配器

Specs2 Matchers for Validated and ValidatedNel

我没有找到 catsValidatedNelspecs2 匹配器,所以我正在编写这样的匹配器:

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 :-)。