我对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.AsResultObject类型的证据参数的隐式值。
致以敬意,
肖希杜尔
发布于 2014-08-14 00:35:38
编译器在这里生成一个错误,因为他试图将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。
发布于 2014-08-13 16:22:26
最好写如下:
"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)
}
}发布于 2014-08-13 16:29:22
你可以尝试的一件事是让SimpleParser成为一种特质。在使用Specs2时,这通常对我更好。然后你可以调用解析(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
}
}在这里,您可以添加您想要测试的其他字段。
编辑:回顾我写的东西,我发现我没有完全回答你的问题。您可以将===和失败放在像您已经有的情况下,但是在我所拥有的框架内。
https://stackoverflow.com/questions/25290067
复制相似问题