测试grails数据绑定

Dón*_*nal 7 grails groovy unit-testing

我写了以下Grails控制器

class CategoryController {

    def create = {
        def newCategory = new CategoryCommand()
        bindData(newCategory, params)
        [newCategory: newCategory]
    }
}

class CategoryCommand {

    String name
    String seoName
}
Run Code Online (Sandbox Code Playgroud)

我编写了这个单元测试来测试数据绑定:

class CategoryControllerTests extends ControllerUnitTestCase {


    void testCreate() {

        // A new ControllerCommand should be returned if invoked with no params
        assertNotNull controller.create()

        // If called with params, they should be bound
        mockParams.name = 'snooker'
        mockParams.seoName = 'snooker-loopy'
        def model = controller.create()

        CategoryCommand newCategory = model.newCategory
        assertEquals 'snooker', newCategory.name
        assertEquals 'snooker-loopy', newCategory.seoName

    }
}
Run Code Online (Sandbox Code Playgroud)

但是在controller.create()调用时我得到了这个异常:

没有方法签名:com.example.CategoryController.bindData()适用于参数类型:(com.example.CategoryCommand,org.codehaus.groovy.grails.web.taglib.GroovyPageAttributes)值:[com.example.CategoryCommand @ 7860e7d2,[:]]

我尝试将其作为集成测试运行,但结果是一样的.

tim*_*tes 6

对......我做了一些挖掘,并发现这个博客页面说(大约一半):


注意:ControllerUnitTestCase不支持某些动态方法.例如:bindData().然后更好地使用集成测试,或者您可以将此方法添加到控制器:

this.controller.metaClass.bindData = { obj, params ->  
  params.each { key, value ->  
    obj."$key" = value  
  }  
}  
Run Code Online (Sandbox Code Playgroud)

或者,我查看了Grails的源代码,并模拟它与Grails的相同,我想你需要这样做:

import org.codehaus.groovy.grails.web.metaclass.BindDynamicMethod

this.controller.metaClass.bindData = { obj, params ->
  new BindDynamicMethod().invoke( delegate, BindDynamicMethod.BIND_DATA_METHOD, [ obj, params ] as Object[] ) ;
}
Run Code Online (Sandbox Code Playgroud)

(我想 - 没有测试过它)