我是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")
}
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设置为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
}
}
从这里您可以添加您想要测试的其他字段。
编辑:回头看看我写的东西,我发现我没有完全回答你的问题。你可以把===和失败放到你已经有过的例子中,但是在我的框架内。