Grails - How to - Модульный тест Сервис, который использует параметры из контроллера - PullRequest
2 голосов
/ 13 октября 2010

Я пытаюсь провести модульное тестирование сервисного метода, который принимает в качестве параметров дату и params LinkedHashMap от контроллера.Настройка выглядит следующим образом:

def save = {CustomCommandObject erc ->
...
    if (erc.conditionProperty != null) {
        def result = myService.ServiceMethod(someDate, params)
    ...
    }
    ....
    redirect(controller: 'controllerName', action: 'actionName', id: params.id)
}

class MyService {
    static transactional = false
    ....
    def TypeToReturn ServiceMethod(Date someDate, def params){
    ...
        TypeToReturn typeToReturn = new TypeToReturn(params)
        return typeToReturn
    }
    ....
}

Один из тегов в представлении GSP имеет тип :

и TypeToReturn имеет свойство:

LocalTime propertyName

Когда приложение нормально работает в браузере, карта параметров правильно передается методу сервиса и newTypeToReturn (params) создает экземпляр TypeToReturn .params содержит следующее:

{java.util.LinkedHashMap$Entry@xxxxx} propertyName_hour -> 20
{java.util.LinkedHashMap$Entry@xxxxx} propertyName_minute -> 30
{java.util.LinkedHashMap$Entry@xxxxx} propertyName -> struct

Поэтому в моем тесте для метода обслуживания у меня есть следующее:

void testSomething() {
    LinkedHashMap<String, String> params = new LinkedHashMap<String, String>();
    params.put("propertyName","struct")
    params.put("propertyName_hour", "20")
    params.put("propertyName_minutes", "30")
    myService = new MyService()
    Date d = new Date()
    myService.ServiceMethod(d,params)
}

Однако , когда я пытаюсь запуститьtest я получаю следующую ошибку:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object 'struct' with class 'java.lang.String' to class
'org.joda.time.LocalTime'

Если я пропускаю params.put ("propertyName", "struct") из карты полностью, то снова (правильно) появляются ошибки, говорящие, чтоTypeToReturn не имеет свойства propertyName_hour

Каким образом мне следует проводить модульное тестирование такого сервисного метода, который использует параметры params Map из контроллера?Простое воссоздание карты в тесте, похоже, не работает.Должна ли карта параметров быть насмешливой или заурядной?

Спасибо

1 Ответ

0 голосов
/ 14 октября 2010

Вы проводите свой тест как единичный или интеграционный тест?Если его там еще нет, попробуйте перевести его в тест / интеграцию и запустить его оттуда с помощью

grails test-app integration:

, который запустит тест в среде Grails и даст плагину joda-time возможность делать любые метамагия программирования, которую он делает, чтобы создать преобразование типов в DateTime, похоже, что вам не хватает.

...