我无法创建一个必须同时使用be_==和失败的测试



我是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:UsershaquesDocumentsworkspaceSBTjsonParsersrctestscalacomtwittersample simpleSimpleParserSpec。scala:17:无法找到类型为org.specs2.execute.AsResult[Object]的证据参数的隐式值

问候,

Shohidul

编译器在这里产生了一个错误,因为他试图将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")
}

okko方法相当于successfailure,但是是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设置为trait。在使用Specs2时,这通常对我来说效果更好。然后你可以调用parse(tweet)。我还建议把测试分开一点。

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
         }
}

从这里您可以添加您想要测试的其他字段。

编辑:回头看看我写的东西,我发现我没有完全回答你的问题。你可以把===和失败放到你已经有过的例子中,但是在我的框架内。

相关内容

  • 没有找到相关文章

最新更新