Spock测试:在“where:”块完成后清理

时间:2015-04-27 14:45:11

标签: groovy spock

我有2种测试方法。

他们都执行where块的每一行,我需要清理add& amp;放松方法。

我已经尝试过cleanup block,void cleanup(),def cleanupSpec(),非套装。

如何在具有“where:”阻止的特定方法后显式运行清理?

def "Add"() {
   setup :
   expect : 
   where:
    }

def "Relax"() {
   setup :
   expect : 
   where:     
    }

3 个答案:

答案 0 :(得分:13)

您可以在方法中使用清理块,如下所示:

@Unroll
def "a method that tests stuff"(){
  given: 
    def foo = fooDAO.save(new Foo(name: name))
  when: 
    def returned = fooDAO.get(foo.id)
  then:
    returned.properties == foo.properties
  cleanup:
    fooDAO.delete(foo.id)
  where:
    name << ['one', 'two']
}

“清理”块将在每次测试迭代时运行一次。

答案 1 :(得分:4)

如果您使用@Unroll,则会为cleanup:块中的每个条目调用where:。要仅运行清理一次,请将代码移到def cleanupSpec()关闭内。

@Shared
def arrayOfIds = []

@Unroll
def "a method that tests stuff"(){
  given: 
  def foo = fooDAO.save(new Foo(name: name))
when: 
  def returned = fooDAO.get(foo.id)
  arrayOfIds << foo.id
then:
  returned.properties == foo.properties
where:
  name << ['one', 'two']
}

def cleanupSpec() {
  arrayOfIds.each {
     fooDAO.delete(it)
  }
}

答案 2 :(得分:0)

cleanupSpec()不可用,因为它是在所有规格测试之后而不是最后一个“ where”项之后调用的。

如果您的规范将包含多个测试,则数据库将仍然充满“一种测试材料的方法”中的材料,直到该文件中的所有测试都将完成。