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,[:]]
我尝试将其作为集成测试运行,但结果是一样的.
对......我做了一些挖掘,并发现这个博客页面说(大约一半):
注意: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)
(我想 - 没有测试过它)
归档时间: |
|
查看次数: |
2492 次 |
最近记录: |