是否可以参数化Spock setup
?
我的意思是,想象一下我有一个对象的状态我要测试。该对象可以有多个状态,但为了简化,我们可以说有一个我特别感兴趣的是S1
。
有多种方法可以将对象转移到S1
。我正在测试状态,因此无论对象如何到达S1
,S1
的所有测试都将是相同的。测试用例之间的一个不同之处是setup
策略。
解决这个问题的一种方法是使用基本测试用例(或“spec”来使用Spock用语)和仅提供不同setup
策略的子类。
但是,鉴于Spock提供的测试具有良好的数据驱动功能,我想知道是否可能有某种方式来参数化设置,以便我不需要具体的子类规范。
实际上,我会说,这是一个规范,现在用这些不同的方式执行设置运行它。
答案 0 :(得分:1)
总是很高兴至少有一些代码作为示例,但是您就可以了。
尝试把您的话写成数据驱动的规范:
class MyObjectSpec extends Specification {
@Unroll
def "Using setup strategy '#desc', instance of MyObject will reach state S1" {
setup:
def myObject = new MyObject()
setupStrategy.call(myObject)
expect:
hasStateS1(myObject)
where:
setupStrategy | desc
{ setupThisWay(it) } | 'this way'
{ setupThatWay(it) } | 'that way'
{ setupAnotherWay(it) } | 'another way'
}
void setupThisWay(MyObject myObject) {
// mutate myObject
}
// setupThatWay, setupAnotherWay
void hasStateS1(MyObject myObject) {
assert myObject.hasStateS1()
}
}
我们正在使用Groovy闭包(在数据表中内联定义)来调用使您新创建的对象发生变异的辅助方法。
在这种情况下,没有when
块,因为您暗示您希望有趣的部分发生在setup
中(与given
相同),并且expect
是then
,不需要when
。
辅助方法的类型为void
,并且按照in the Spock documentation的建议进行自己的断言(实际上使then
/ expect
不起作用,但是Spock编译器强制执行该操作。
数据驱动的文档为here。