scala spec2 Я не могу создать тест, который должен быть _== и провалом одновременно

Я новичок в Scala и Spec2.

Я хотел бы создать следующий тест, но я получаю сообщение об ошибке от компилятора.

Вот тест, который я хотел бы написать

import org.specs2.mutable._
import org.specs2.specification._
import org.specs2.matcher._
import org.specs2.matcher.MatchResult

class SimpleParserSpec extends Specification {

"SimpleParser" should {

val parser = new SimpleParser()

  "work with basic tweet" in {
      val tweet = """{"id":1,"text":"foo"}"""
      parser.parse(tweet) match {
        case Some(parsed) => {
                                parsed.text must be_==("foo")
                                parsed.id must be_==(1)
                              }
        case _ =>  failure("didn't parse tweet") 
      }
    }
  }
}

Я получаю сообщение об ошибке: C:\Users\haques\Documents\workspace\SBT\jsonParser\src\test\scala\com\twitter\sample\simpleSimpleParserSpec.scala:17: не удалось найти неявное значение для параметра улик типа org.specs2.execute.AsResult[Объект]

С Уважением,

Shohidul

3 ответа

Решение

Компилятор выдает здесь ошибку, потому что он пытается унифицировать MatchResult[Option[Parsed]] с провалом типа Result, Они объединяются как Object и компилятор не может найти AsResult экземпляр класса типов для этого. Вы можете исправить свой пример, предоставив другой MatchResult для неудачного случая:

parser.parse(tweet) match {
  case Some(parsed) => {
    parsed.text must be_==("foo")
    parsed.id must be_==(1)
  }
  case _ =>  ko("didn't parse tweet")
}

ok а также ko методы эквивалентны success а также failure но есть MatchResults вместо того, чтобы Results,

Лучше бы написать это следующим образом:

"work with basic tweet" in {
  val tweet = """{"id":1,"text":"foo"}"""
  parser.parse(tweet) aka "parsed value" must beSome.which {
    case parsed => parsed.text must_== "foo" and (
      parsed.id must_== 1)
  }
}

Одна вещь, которую вы могли бы попробовать, это сделать SimpleParser свойством. Обычно это работает лучше для меня при использовании Specs2. Тогда вы можете позвонить parse (твит). Я бы также предложил немного разбить тесты.

class SimpleParserSpec extends Specification with SimpleParser { 
     val tweet = """{"id":1,"text":"foo"}"""
     SimpleParser should {
        "parse out the id" in {
              val parsedTweet = parse(tweet)
              parsedTweet.id === 1
         }
}

Отсюда вы можете добавить другие поля, которые вы хотите проверить.

РЕДАКТИРОВАТЬ: оглядываясь на то, что я написал, я вижу, что я не полностью ответил на то, что вы спрашивали. Вы можете поместить === и затем провал в те случаи, которые у вас уже были, но в рамках того, что у меня есть.

Другие вопросы по тегам