Grails 控制器单元测试中的模拟gorm方法

Grails 控制器单元测试中的模拟gorm方法,grails,gorm,spock,Grails,Gorm,Spock,我正在使用Grails2.4.4,试图为控制器编写一个Spock测试,当我试图模拟gorm Finder时遇到了问题。文档似乎有点混乱。据说完全可以嘲笑戈姆,但我正在努力 这是控制器 class AlertController { SpringSecurityService springSecurityService def dismiss() { Long id = request.getJSON().id log.debug ("dismiss called for

我正在使用Grails2.4.4,试图为控制器编写一个Spock测试,当我试图模拟gorm Finder时遇到了问题。文档似乎有点混乱。据说完全可以嘲笑戈姆,但我正在努力

这是控制器

class AlertController {

SpringSecurityService springSecurityService


def dismiss() {

    Long id = request.getJSON().id

    log.debug ("dismiss called for alert id ${id}")

    Alert alert = Alert.get(id)

    if(alert){ 

        alert.acknowledged = true



        if(!alert.save(flush:true)){
            log.warn("dismiss failed: ${alert.errors}")
            def result = [status:1]
            render result as JSON
            return
        }else{
        ....
现在我得到了一个测试(在unit文件夹中,即非集成):

}

所以我让测试工作,但我想知道如何绕过保存所有实体。。。i、 只需模拟Alert.get()和Alert.save()动态调用

@TestFor(AlertController)
@Mock([Alert, User, Trust, Patient])
@TestMixin(DomainClassUnitTestMixin)
class AlertControllerSpec extends Specification {

def setupSpec() {

}

def cleanup() {
}


void testDismiss() {

    given:

    def user = new User(id: 1,name: 'sdsd', email:    'asdasda@asdasd.com',firstName: 'aasdasdasd', lastName: 'asdasdasdasd',
            trust: new Trust(version:1, name:'asasas',shortname: 'sdsdsd' ).save(failOnError: true)).save(failOnError: true)

    def alert = new Alert(
            id:1,type:'sdfsdf', status:'sdsdds',acknowledged: false,alertDate: new Date(),comments: 'asas',dateCreated: new Date(),     lastUpdated: new Date(),
            assignedTo: user,
            patient: new Patient(

            )).save(failOnError: true)



    when:
    controller.request.addHeader("Accept","application/json")
    controller.request.json = [id:1]
    controller.dismiss()

    then:
    response.json.status == 0
}

}

Grails测试mixin的便利特性是,它们提供了Gorm的一个轻量级内存实现,因此您实际上不必存根对Gorm的任何调用(就像您在rails中使用rspec时所做的那样)——测试中的代码没有看到区别

因此,在本规范中,只需断言控制器的响应

given: def alert = new Alert(..)

when:
controller.request.json = [id: alert.id]
controller.action()

then: controller.response.json == [..]
given: def alert = new Alert(..)

when:
controller.request.json = [id: alert.id]
controller.action()

then: controller.response.json == [..]