在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 ...
}
// ...
}
。)
答案 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 有返回异常,您可以捕获它并使该方法返回一个选项。