Собственный сопоставитель ScalaTest, использование слова не

Итак, в начале у меня было

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)

Разрывы. Конечно, я никогда не говорил, что это может совпадать с отрицательным значением. Так как же мне это сказать?


person Illiax    schedule 31.10.2013    source источник


Ответы (3)


Хитрость заключается в том, чтобы объявить неявный класс для рассмотрения «отражать» как метод результата ("False"shouldnot) типа ResultOfNotWordForAny[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
person Mikaël Mayer    schedule 30.11.2013

Вам не нужно менять свой сопоставитель, я думаю, вам просто нужны скобки:

"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))
person Noah    schedule 25.11.2013
comment
Похоже, вы проверяли это, так что, если это работает, это работает. Тем не менее, буквальное использование имени класса ReflectBooleanMatcher нарушает удобочитаемость BDD, устраняя любой вид DSL. Зачем тогда вообще использовать ScalaTest? - person Vidya; 01.12.2013

Я просто скопирую документацию:

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.

person Vidya    schedule 30.11.2013