【问题标题】:Mocking gorm methods in a controller unit test在控制器单元测试中模拟 gorm 方法
【发布时间】:2015-08-10 13:13:11
【问题描述】:

我正在使用 Grails 2.4.4 并尝试为控制器编写 Spock 测试,并在尝试模拟 gorm finder 时遇到问题。文档似乎有点混乱。据说它可以完全模拟 gorm,但我正在努力解决它..

这里是控制器

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{
        ....

现在我得到了一个测试(在单元文件夹中,即不是集成):

@TestFor(AlertController)
@Mock(Alert)
@TestMixin(DomainClassUnitTestMixin)
class AlertControllerSpec extends Specification {

def setupSpec() {

    new Alert(
            id: 1, acknowledged: false,alertDate: new Date(),comments: 'asas',dateCreated: new Date(), lastUpdated: new Date(),
            assignedTo: new User(id: 1,name: 'sdsd', email: 'asdasda@asdasd.com',firstName: 'aasdasdasd', lastName: 'asdasdasdasd',
                    trust: new Trust(id: 1))
    ).save(flush: true) //fails with Method on class [Alert] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.



}

def cleanup() {
}

void "test dismiss"() {

    when:

    // whats the correct way to mock the Alert.get(2)

    // and the correct way to mock save()  ??

    /*def mockControl = new GrailsMock(Alert)
    mockControl.demand.save() {-> return true}           // Instance method
    mockControl.demand.static.get() {id -> return new Alert()}  // Static method*/


    /*GrailsMock mockAlert = mockFor(Alert)
    mockAlert.demand.static.get() { Long id -> new Alert(id:1) }
    mockAlert.demand.static.save(flush: true) { -> true }
    mockAlert.createMock()*/

    controller.request.addHeader("Accept","application/json")
    request.json = "{'id':1}"
    controller.dismiss()

    then:
    response.json.status == '0'
}

}

所以我得到了测试工作,但我很想知道如何绕过保存所有实体......即通过模拟 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 grails-orm spock


    【解决方案1】:

    Grails 测试 Mixins 的便利特性是它们提供了轻量级的 Gorm 内存实现,因此您实际上不必存根对 Gorm 的任何调用(例如在 rails 中使用 rspec) - 代码如下测试只是看不出区别。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2020-01-05
      • 2014-07-30
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多