【问题标题】:scala spec2 I am Unable to create a test that uses must be_== and failure at the same timescala specs2我无法创建一个必须同时使用_==和失败的测试
【发布时间】:2014-08-13 15:21:26
【问题描述】:

我是 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 类型的证据参数的隐式值[对象]

问候,

肖希杜尔

【问题讨论】:

    标签: scala testing specs2 scala-2.11 spec2


    【解决方案1】:

    编译器在此处产生错误,因为他试图将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

    【讨论】:

    • 酷。谢谢。正是我想要的。工作一种享受。
    【解决方案2】:

    最好这样写:

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

    【讨论】:

    • 您的代码示例运行良好。但是,有没有办法在使用原始问题中发布的匹配时同时使用 failure() 并且必须是_==()?
    • failure 在那里没用,好像结果与beSome 不匹配,specs 将表明期望不成功。
    • 我正在寻找的方法是失败。对于success(),你会使用ok。它写在下面的回复中。对我来说使用 ok 和 ko 会使代码更容易编写。
    • 所以你最好使用其他的东西而不是指定的。这不是它应该使用的方式。用 ko 处理失败是没用的。
    【解决方案3】:

    您可以尝试的一件事是让 SimpleParser 成为一个特征。在使用 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
             }
    }
    

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

    编辑:回顾我写的内容,我发现我没有完全回答你的问题。您可以将 === 然后失败放入您已经拥有的案例中,但在我所拥有的框架内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2021-05-19
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多