在specs2中,有条件地执行从函数返回的结果的子测试,可能会抛出异常

时间:2013-03-21 16:23:19

标签: scala testing bdd specs2

在specs2中,表达子测试模式的正确方法是什么,只有在其“父”测试返回结果而不抛出异常时才会执行?

我有一个函数maybeGiveMeAThing,它可以返回Thing,也可以抛出异常。

电话看起来像这样:

val thing: Thing = maybeGiveMeAThing("foo", "bar" "baz"

我想用一组输入测试,maybeGiveMeAThing成功返回Thing而不抛出异常,并使用返回的Thing,进行进一步的测试以确保它是正确的{{1}返回给Thing的参数。

我当前设置测试的方式,如果对maybeGiveMeAThing的调用抛出异常,整个测试套件将被中止。这将是我更喜欢的逻辑:

  • 如果成功返回maybeGiveMeAThing,请继续进行一组分析事物内容的子测试
  • 如果Thing引发异常(任何异常),请跳过分析事物的子测试,但继续其余测试

我现有的测试代码大致如下:

maybeGiveMeAThing

......虽然这感觉就像是从正确的方式做到这一点。什么是正确的方法?
(如果我能提供帮助,我想避免使用// ... "with good parameters" in { var thing: Thing = null "return a Thing without throwing an exception" in { thing = maybeGiveMeAThing("some", "good", "parameters", "etc.") } should not(throwA[Exception]) "the Thing returned should contain a proper Foo" in { thing.foo mustBe "bar" } //... etc ... } // ... } 。)

2 个答案:

答案 0 :(得分:4)

一种可能性是使用@alexwriteshere答案中的条件:

"parent test" in {
  val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

  thing match {
    case Some(thing) =>
      "child test 1" in ok
      "child test 2" in ok
    case None =>
      "skipped tests" in skipped
  }
}

但是,您需要在Example案例中添加None,以便in方法的块具有可接受的类型。

这种方法的一大缺点是规范在定义时正在执行。这意味着:

  • 如果maybeGiveMeAThing出现异常,那么整个规范就会爆炸
  • 如果您选择使用thing排除示例,则仍会构建

另一个选择是使用Step说任何先前的失败将跳过所有下一个示例:

class MySpec extends mutable.Specification {
  "This is a test with a thing" >> {
    lazy val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

    "the thing should be ok" >> {
      thing must beOk
    }

    step(stopOnFail = true)
    "other examples with thing" >> {
      "ex1" >> ok
      "ex2" >> ok
    }
  }
}

答案 1 :(得分:3)

一个简单的if / else与子案例将做你想要的。或者,您可以使“maybeGiveMeAThing”方法返回一个选项,然后匹配它。

"parent test" in {
      val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

      thing match {
        case Some(thing) =>
          "child test 1" in {
            ...
          }

          "child test 2" in {
            ...
          }
        case None =>
          // don't run additional tests
      }
    }

如果maybeGiveMeAThing 返回异常,您可以捕获它并使该方法返回一个选项。