Как протестировать сортировку по умолчанию в модульном тесте Grails с поддельными доменами - PullRequest
2 голосов
/ 07 сентября 2010

Можно ли протестировать сортировку '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

1 Ответ

2 голосов
/ 08 сентября 2010

Нет хорошего способа проверить фактическую сортировку в модульных тестах, о которых я знаю. То, что вы пытаетесь протестировать, на самом деле является такой неотъемлемой частью интеграции GORM, что тестирование его на объектах доменных имен, даже если они поддерживают отображение сортировки, не проверяет фактический код, который будет выполняться.

Самым близким, что вы могли бы сделать в модульном тесте, было бы взглянуть на объект статического отображения, чтобы утверждать, что значение «sort» установлено на то, что вы ожидаете.

Я недавно написал в блоге 1006 * о том, как опрашивать классные замыкания для значений. Эту технику можно использовать, чтобы утверждать, что порядок сортировки установлен так, как вы ожидаете, вот так:

Объект домена 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...