2

在 Specs2 中,forallandforeach方法可用于将单个项目的匹配器转换为原始类型项目序列的匹配器,并且 ^^^ 可用于在匹配它们之前对实际值预期值进行预处理。但是我怎样才能将两者结合起来呢?

我试过了

((s must myMatcher(x)) ^^^ (_.toLowerCase)).forall(collection)

但这不会编译。

4

1 回答 1

2

这个问题实际上与forall. 将 移到forall前面以增加可读性(这不是必需的)后,可以通过如下重写来编译代码:

forall(collection) ((_: String) must myMatcher(x) ^^^ (_.toLowerCase))

这可以通过阅读“使用序列”一节中的 specs2 文档并查看所涉及的类型来解决。

此外,匹配器必须是org.specs2.matcher.AdaptableMatcher. 如果您正在编写自己的匹配器,则需要自己手动子类化此类,因为 specs2 无法知道您的匹配器在做什么,并且会神奇地自动调整它。类子类化的一个示例AdaptableMatcherorg.specs2.matcher.BeTypedEqualTo.

在特定情况下

myMatcher(x) ^^^ (_.toLowerCase)

通过将其替换为以下内容,可以缩短此片段并使其更具可读性和声明性:

(myMatcher(x) ignoreCase)

ifmyMatcher(x)具有类型AdaptableMatcher[Any]并将其值转换为与字符串进行比较。

于 2012-09-19T11:09:35.850 回答