2

我正在尝试创建一个 specs2 匹配器来断言File扩展的有效性(通过重用现有的endWith匹配器)。但是我得到一个类型错误。我怎么能绕过它?

import java.io.File
import org.specs2.mutable.Specification
import org.specs2.matcher.{ Expectable, Matcher }

class SampleSpec extends Specification {
  def hasExtension(extension: => String) = new Matcher[File] {
    def apply[S <: File](actual: Expectable[S]) = {
      actual.value.getPath must endWith(extension)
    }
  }
}

这是编译器错误:

<console>:13: error: type mismatch;
 found   : org.specs2.matcher.MatchResult[java.lang.String]
 required: org.specs2.matcher.MatchResult[S]
             actual.value.getPath must endWith(extension)
4

2 回答 2

2

您确实可以使用^^运算符(从解析器组合运算符中获取灵感)并简单地编写:

def hasExtension(extension: =>String) = endWith(extension) ^^ ((_:File).getPath)

作为参考,这里介绍了创建自定义匹配器的各种方法。

于 2012-07-18T13:15:05.520 回答
0

好的,我已经通过使用^^在匹配器类型之间适应的运算符来工作了。对我来说,它看起来像是一个仿函数的映射函数。

def hasExtension(extension: => String) = new Matcher[File] {
  def apply[S <: File](actual: Expectable[S]) = {
    actual must endWith(extension) ^^ ((file: S) => file.getPath)
  }
}
于 2012-07-18T09:51:32.053 回答