2010-10-13 116 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的類型轉換,它看起來像缺少了。

相關問題