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 に答える