Unit testing 作为Groovy-Spock方法的经典单元测试
我有一个Groovy Spock方法,它具有以下模式:Unit testing 作为Groovy-Spock方法的经典单元测试,unit-testing,testing,groovy,junit,spock,Unit Testing,Testing,Groovy,Junit,Spock,我有一个Groovy Spock方法,它具有以下模式: def "My test"() { def a = createA(); assert a.fieldLevel1.isValid() def b = a.fieldLevel1 assert b.fieldLevel2.isValid() def c = b.fieldLevel2 assert c.fieldLevel3.isValid() ... } 正如您所看到的,由于断言和变量定义混合在一起,很难在块
def "My test"() {
def a = createA();
assert a.fieldLevel1.isValid()
def b = a.fieldLevel1
assert b.fieldLevel2.isValid()
def c = b.fieldLevel2
assert c.fieldLevel3.isValid()
...
}
正如您所看到的,由于断言和变量定义混合在一起,很难在块上打破它。斯波克写这种测试的方法是什么
更新:
测试具有以下结构,因为c.fieldLevel3.isValid实际上是A的c.fieldLevel3实例,所以如果字段无效,我就不能继续进行。单元测试的经典方法是保持测试的单一性。也就是说,每个测试测试一件事情,在本例中似乎不是这样 尽管如此,您可以在设置块中的所有设置代码之后,将expect块中的所有断言分组: 注意,通过使用Groovy的goodies访问isValid as valid并直接在辅助对象上调用该方法,我缩短了断言 此外,我没有使用通常的when/then Spock块,因为这个测试用例似乎与给定系统上的刺激/响应不太一致。但如果您愿意,也可以使用许多when和then交替块:
def "My test"() {
when: def b = createA().fieldLevel1
then: b.valid
when: def c = b.fieldLevel2
then: c.valid
when: def d = c.fieldLevel3
then: d.valid
}
单元测试的经典方法是保持测试的单一性。也就是说,每个测试测试一件事情,在本例中似乎不是这样 尽管如此,您可以在设置块中的所有设置代码之后,将expect块中的所有断言分组: 注意,通过使用Groovy的goodies访问isValid as valid并直接在辅助对象上调用该方法,我缩短了断言 此外,我没有使用通常的when/then Spock块,因为这个测试用例似乎与给定系统上的刺激/响应不太一致。但如果您愿意,也可以使用许多when和then交替块:
def "My test"() {
when: def b = createA().fieldLevel1
then: b.valid
when: def c = b.fieldLevel2
then: c.valid
when: def d = c.fieldLevel3
then: d.valid
}
不知道你为什么不接受上面的答案,看起来很好 作为一个小区别,您还可以执行以下操作:
def "My test of creating an A"() {
when:
def a = createA()
then:
a.fieldLevel1.isValid()
a.fieldLevel1.fieldLevel2.isValid()
a.fieldLevel1.fieldLevel2.fieldLevel3.isValid()
}
你是否“喜欢”这一点取决于你对德米特“定律”的遵循程度——Groovy似乎让这一点比过去更不相关
如果实际底层对象的复杂性使得这不是验证它们的有效方法,那么它们可能需要自己的单元测试。不确定您为什么不接受上面的答案看起来很好 作为一个小区别,您还可以执行以下操作:
def "My test of creating an A"() {
when:
def a = createA()
then:
a.fieldLevel1.isValid()
a.fieldLevel1.fieldLevel2.isValid()
a.fieldLevel1.fieldLevel2.fieldLevel3.isValid()
}
你是否“喜欢”这一点取决于你对德米特“定律”的遵循程度——Groovy似乎让这一点比过去更不相关
如果实际底层对象的复杂性使得这不是验证它们的有效方法,那么它们可能需要自己的单元测试