【问题标题】:How do you test default sort in a grails unit test with mocked domains如何在带有模拟域的 grails 单元测试中测试默认排序
【发布时间】:2010-09-07 15:12:09
【问题描述】:

是否可以测试staticMappingBlock中定义的排序propertyName

这在集成阶段有效,但在我的域拥有的单元阶段无效:

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

【问题讨论】:

    标签: unit-testing grails


    【解决方案1】:

    据我所知,没有任何好的方法可以在单元测试中测试实际排序。您要测试的实际上是 GORM 集成中不可或缺的一部分,即使在模拟的域对象上测试它,即使它们支持排序映射,也不会测试将要运行的实际代码。

    您可以在单元测试中做的最接近的事情是查看静态映射对象以断言“排序”的值设置为您期望的值。

    我不久前整理了一个blog post,关于如何询问常规闭包的值。此技术可用于断言排序顺序设置为您所期望的,如下所示:

    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
            }
        }
    }
    

    【讨论】:

    • 我想使用这种方法你可以获取默认排序,然后应用该排序并查看它是否匹配,但这似乎太过分了,我认为它不值得以这种方式进行测试。我有涵盖它的集成测试,而且由于我还有其他需要集成阶段的测试,所以它不仅仅适用于这个测试。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2021-10-28
    • 2014-06-29
    相关资源
    最近更新 更多