2017-01-27 9 views
2

Я не могу получить specs2 для печати любых пользовательских сообщений.Как я могу использовать пользовательские сообщения с изменяемыми спецификациями specs2?

import org.junit.runner.RunWith 
import org.specs2.mutable.Specification 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class MessageSpecs extends Specification { 
    "This" should { 
    "fail" in { 
     true.must(beFalse).setMessage("this should PRINT") 
     //true.must(beFalse.setMessage("this should PRINT")) // or maybe this? no. 
     //true.must(beFalse).updateMessage(_ => "this should PRINT") // not this either 
    } 
    } 
} 

Я просто получаю сообщение об ошибке по умолчанию «значение true». Это на specs2 3.8.5, используя JUnitRunner через maven. Я еще не пробовал это в проекте sbt. Документация, которую я могу найти, предполагает, что это должно сработать.

--- Edit ---

рода-обходным: true.aka("this should PRINT").must(beFalse) // works

Это печатает немного уродливый, когда используется на практике для описания сложной неудачи, но, по крайней мере, он печатает, так Я могу добавить дополнительный контекст, необходимый для более простого понимания отказа.

ответ

3

Основная проблема здесь заключается в том, что вы используете изменяемую спецификацию. В измененной спецификации исключения выдаются, когда результат неверен. В этом случае, прежде чем вы даже попытаетесь установить другое сообщение, тест завершится неудачно (с исходным сообщением).

У вас есть 2 варианта:

  • установить сообщение на самом согласовани

    false must beTrue.setMessage("ko") 
    
  • захвата результат с org.specs2.execute.AsResult (это перехватывает исключения)

    AsResult(false must beTrue).updateMessage("ko") 
    

Вы также заметите, что API для установки/обновления сообщений несколько отличается в зависимости от установки сообщения на MatchResult (для которого имеется согласованный объект) и Result (что является более общим понятием). Первый использует setMessage, последний использует updateMessage.

И для записи, есть и другие способы, чтобы добавить больше информации для данной неисправности:

  • использования aka для описания фактического значения, как вы заметили,

  • использовать фразу для описания полное ожидание

    "Values are correct" ==> { 
        values must beCorrect 
    } 
    
  • создать новый Искатель

    def myMatcher: Matcher[Int] = (i: Int) => 
        (test(i), s"what's wrong with $i") 
    
+0

Thanks @Eric. Я довольно уверен, что видел это с помощью более сложных помощников, чем beFalse, что привело меня к тому, чтобы уменьшить его до вышесказанного. Если я увижу их снова, я напишу здесь. Однако с тех пор я повторно организовал спецификацию, и я использую 'aka', поскольку она кажется более надежной. –

+0

Скотт, я обновил ответ. – Eric