4

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

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

调用如下所示:

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

我想用一组输入来测试它,它maybeGiveMeAThing成功地返回一个 Thing 而不会引发异常,并使用返回的 Thing,做进一步的测试,以确保它是正确Thing返回给maybeGiveMeAThing.

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

  • 如果 aThing成功返回,则继续进行一组子测试来分析事物的内容
  • 如果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 ...
}

// ...

}

...尽管这感觉与正确的做法相去甚远。什么是正确的方法?
(如果可以的话,我想避免使用vars 。)

4

2 回答 2

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

但是,您需要ExampleNonecase 中添加一个,以便该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
    }
  }
}
于 2013-03-22T03:50:48.980 回答
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必须返回一个异常,您可以捕获它并使该方法返回一个选项。

于 2013-03-21T16:42:12.180 回答