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