使用metaclass.render进行spock测试

时间:2014-06-11 20:07:44

标签: grails groovy spock

为了在渲染(模板)中进行模型的集成测试,我使用metaClass.render将模型存储在地图中。但是,地图似乎不适用于'其中'块

def renderMap
def mmc

def setup() {
    MilestonesMgtController.metaClass.render = { Map map ->
        renderMap = map
    }
    mmc = new MilestonesMgtController()
}

void "create a new milestone"() {
    when:
    mmc.params.newName = 'Written Workshop'
    mmc.params.newDeadlineFT = a
    mmc.params.newDeadlinePT = '4'
    mmc.params.newNotificationFT = '7'
    mmc.params.newNotificationPT = '7'
    mmc.newMilestone()

    then:
    renderMap.template == 'milestoneDetails'
    renderMap.model.errorMessages == b

    where:
    a    |  b
    '4'  |  null                      //first test
    '0'  |  'deadlineFT cannot be 0'  //second test
}

第二次测试'其中'块失败,它表示renderMap为null。如果我改变第一次和第二次测试之间的顺序,结果是一样的。似乎第一轮后renderMap为null。你知道代码有什么问题吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您在集成测试中启动Class级元类,那么您将真正开始自我攻击。与单元测试不同,这些元类更改不会被回滚,并且感染您的测试运行中的元类污染。

如果您确实需要集成测试,请尝试metaClassing控制器实例以防止污染。我很好奇这是否能解决你的问题。此外,我倾向于使用@Shared这样的案例,虽然我不确定这是非常必要的。

@Shared renderMap
@Shared mmc

def setup() {
    mmc = new MilestonesMgtController()
    mmc.metaClass.render = { Map map -> renderMap = map }
}