2010-10-13 87 views
1

我想单元测试服务方法,它需要参数日期和params LinkedHashMap从控制器。设置如下:Grails - 如何 - 单元测试使用来自控制器的params的服务

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视图标签的类型为<乔达:timerPicker>

TypeToReturn有一个属性:

LocalTime propertyName 

当应用程序在浏览器中正常运行时,params映射会正确传递到服务方法并且新的TypeToReturn(params)创建一个实例TypeToReturn。 PARAMS包含以下内容:

{[email protected]} propertyName_hour -> 20 
{[email protected]} propertyName_minute -> 30 
{[email protected]} 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) 
} 

然而当我尝试和运行测试,我得到以下错误:

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

如果我ommit params.put( “PROPERTYNAME”, “结构”) FR OM地图完全然后再它(正确)错误说TypeToReturn不具有财产propertyName_hour

因此如何,我应该是单元测试,以便使用从控制器PARAMS地图服务的方法?在测试中重新创建地图似乎不起作用。 Params Map是否应该以一种特殊的方式被嘲弄/残留?

感谢

回答

0

你运行你的测试作为一个单元或集成测试?如果不是已经存在,尝试将其移动到测试/集成和使用

grails test-app integration: 

运行Grails的环境中测试从那里运行它,将会给乔达时间插件机会做任何的元编程魔术它正在创建向DateTime的类型转换,它看起来像缺少了。

相关问题