3

だから最初は持っていた

def parseB(string : String)(implicit context : Context) : Float = parseAll(gexp, string).get.eval(context).left.get

そしてテストで

implicit var context = Context()
parseB("False") should be(false)
parseB("False") should not be(true)

それから私はカスタムマッチャーを書きました

case class ReflectBooleanMatcher(value : Boolean)(implicit context : Context) extends Matcher[String] with ExpressionParser{
  def parseB(string : String) : Boolean = parseAll(gexp, string).get.eval(context).right.get
  def apply (string : String) : MatchResult = 
      MatchResult(parseB(string) == value, "", "")
}

だから私のテストは

"False" should reflectBoolean(false)

しかし

"False" should not reflectBoolean(true)

休憩 - もちろん、それが否定的に一致する可能性があるとは決して言いませんでした. それで、私はそれをどのように言うのですか?

4

3 に答える 3

5

マッチャーを変更する必要はありません。括弧が必要なだけだと思います。

"False" should ReflectBooleanMatcher(false)
"False" should not(ReflectBooleanMatcher(true)) //works!

アップデート

次のように定義する場合、@VidyaのコメントごとreflectBooleanに:

def reflectBoolean(value: Boolean) = new ReflectBooleanMatcher(value)

次に、「BDD」スタイルの構文を使用できます。括弧を使用すると、次のように機能します。

"False" should reflectBoolean(false)
"False" should not(reflectBoolean(true))
于 2013-11-25T04:46:57.967 に答える
4

トリックは、暗黙のクラスを宣言して、「reflect」を type の () の結果のメソッドと見なすことです。"False"shouldnotResultOfNotWordForAny[String]

def parseB(string : String)(implicit context : Context) : Float = parseAll(gexp, string).get.eval(context).left.get

implicit var context = Context()
parseB("False") should be(false)
parseB("False") should not be(true)

// Declares an implicit class for applying after not. Note the use of '!='
implicit class ReflectShouldMatcher(s: ResultOfNotWordForAny[String]) {
  def reflect(value: Boolean) = s be(BeMatcher[String] {
    left => MatchResult(parseB(left) != value, "", "")
  })
}
// Declares an explicit method for applying after should. Note the use of '=='
def reflect(right: Boolean) = Matcher[String]{ left =>
            MatchResult(parseB(left) == right, "", "")}

// Now it works. Note that the second example can be written with or wo parentheses.
"False" should reflect(false)
"False" should not reflect true
于 2013-11-30T18:40:17.377 に答える
1

私はちょうどドキュメントをはぎ取るつもりです:

trait CustomMatchers {    
  class ReflectBooleanMatcher(value: Boolean)(implicit context : Context) extends Matcher[String] with ExpressionParser {
     def parseB(string: String) : Boolean = parseAll(gexp, string).get.eval(context).right.get
     def apply(string: String) : MatchResult = MatchResult(parseB(string) == value, "", "")      
  }

  def reflectBoolean(value: Boolean) = new ReflectBooleanMatcher(value)
}

今すぐreflectBooleanメソッドを使用してみてください。

于 2013-11-30T05:02:42.160 に答える