是否可以测试排序propertyName
这是定义在staticMappingBlock
?
这在集成阶段有效,但在我的域具有的单元阶段无效:
static mapping = {
sort 'lastName'
}
void testDefaultSortOrder(){
def agent1 = new CommissionAgent(firstName: 'fred', lastName: 'b', active:true).save()
def agent2 = new CommissionAgent(firstName: 'fred2', lastName:'a', active:false).save()
def agents = CommissionAgent.list()
assertEquals 'sort order is wrong', agents[0].lastName, agent2.lastName
assertEquals 'sort order is wrong', agents[1].lastName, agent1.lastName
}
Grails 版本是 1.3.1
据我所知,没有任何好的方法来测试单元测试中的实际排序。您尝试测试的实际上是 GORM 集成的一个组成部分,即使它们支持排序映射,在模拟域对象上测试它也不会测试将运行的实际代码。
您在单元测试中可以做的最接近的事情是查看静态映射对象,以断言“sort”的值已设置为您期望的值。
我整理了一个博客文章 http://naleid.com/blog/2010/01/24/interrogating-arbitrary-groovy-closures-for-values/不久前关于如何询问常规闭包的值。此技术可用于断言排序顺序设置为您期望的值,如下所示:
Foo 域对象:
package com.example
class Foo {
String name
static mapping = {
sort "name"
}
}
FooTests 单元测试:
package com.example
import grails.test.*
class FooTests extends GrailsUnitTestCase {
void testFooSort() {
def mappingValues = ClosureInterrogator.extractValuesFromClosure(Foo.mapping)
assertEquals "name", mappingValues.sort
}
}
ClosureInterrogator 类允许您查看闭包的作用:
package com.example
class ClosureInterrogator {
private Map closureValueMap = [:]
static Map extractValuesFromClosure(Closure closure) {
def interrogator = new ClosureInterrogator(closure)
return interrogator.closureValueMap
}
private ClosureInterrogator(Closure closure) {
def oldResolveStrategy = closure.getResolveStrategy()
def oldDelegate = closure.getDelegate()
closure.delegate = this
closure.resolveStrategy = Closure.DELEGATE_FIRST
try {
closure()
} finally {
closure.setDelegate(oldDelegate)
closure.setResolveStrategy(oldResolveStrategy)
}
}
// property getter
def propertyMissing(String name) {
return closureValueMap[name]
}
// property setter
def propertyMissing(String name, value) {
closureValueMap[name] = value
}
def methodMissing(String name, args) {
if (args.size() == 1) {
closureValueMap[name] = args[0]
} else {
closureValueMap[name] = args
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)