在 Specs2 中,forall
andforeach
方法可用于将单个项目的匹配器转换为原始类型项目序列的匹配器,并且 ^^^ 可用于在匹配它们之前对实际值和预期值进行预处理。但是我怎样才能将两者结合起来呢?
我试过了
((s must myMatcher(x)) ^^^ (_.toLowerCase)).forall(collection)
但这不会编译。
这个问题实际上与forall
. 将 移到forall
前面以增加可读性(这不是必需的)后,可以通过如下重写来编译代码:
forall(collection) ((_: String) must myMatcher(x) ^^^ (_.toLowerCase))
这可以通过阅读“使用序列”一节中的 specs2 文档并查看所涉及的类型来解决。
此外,匹配器必须是org.specs2.matcher.AdaptableMatcher
. 如果您正在编写自己的匹配器,则需要自己手动子类化此类,因为 specs2 无法知道您的匹配器在做什么,并且会神奇地自动调整它。类子类化的一个示例AdaptableMatcher
是org.specs2.matcher.BeTypedEqualTo
.
在特定情况下
myMatcher(x) ^^^ (_.toLowerCase)
通过将其替换为以下内容,可以缩短此片段并使其更具可读性和声明性:
(myMatcher(x) ignoreCase)
ifmyMatcher(x)
具有类型AdaptableMatcher[Any]
并将其值转换为与字符串进行比较。