2014-07-19 102 views
2

我們正在爲Grails 2.4升級做準備。我們面臨的其中一個問題是 大多數命令對象單元測試失敗,因爲注入屬性(如 服務)在驗證過程中要求不爲空。Grails 2.4命令對象可空約束和依賴注入

有沒有什麼建議的方式來測試這個?我們應該嘲笑所有的屬性,儘管有些不需要測試嗎?或者有什麼辦法可以做到這一點?

我的問題是由傑夫回答後,我與有關新功能的詳細信息的鏈接: doWithSpring和doWithConfig是不久將在什麼新的2.4描述:在單元測試中改進部分http://grails.org/doc/latest/guide/introduction.html#whatsNew24 還有一個JIRA問題與示例:https://jira.grails.org/browse/GRAILS-11003

+1

@danielad:請不要添加代碼跨度('像這樣')來強調。有關更多信息,請參見[此Meta帖子](http://meta.stackexchange.com/a/165710)。 –

回答

3

大多數單元測試不希望或者不需要應用程序上下文全部啓動和填充。單元測試可以嚮應用程序上下文添加任何他們想要的(或者什麼都不)。在最新版本的Grails,你可以做這樣的事情......

控制器和命令對象:

// grails-app/controllers/demo/DemoController.groovy 
package demo 

class DemoController { 

    def processName(SomeCommand co) { 
     render co.someValue 
    } 
} 

class SomeCommand { 
    String name 
    def helperService 

    def getSomeValue() { 
     helperService.processValue(name) 
    } 
} 

服務:

// grails-app/services/demo/HelperService 
package demo 

class HelperService { 

    def processValue(String originalValue) { 
     "__${originalValue}__" 
    } 
} 

單元測試:

// grails-app/test/unit/demo/DemoControllerSpec.groovy 
package demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(DemoController) 
class DemoControllerSpec extends Specification { 

    def doWithSpring = { 
     helperService HelperService 
    } 

    void 'process name'() { 
     when: 
     params.name = 'Jeff' 
     controller.processName() 

     then: 
     response.contentAsString == '__Jeff__' 
    } 
} 

該測試將通過Grails 2.4.2。

我希望有幫助。

+0

當然,如果單元測試希望在上下文中添加一個假的「helperService」版本,那很好。 「doWithSpring」塊中的helperService HelperService可以替代'helperService MyFakeHelperService'。 –

+0

謝謝傑夫。 'doWithSpring'回答我的問題 – droggo

+0

太好了。我可以剛剛描述doWithSpring,但我認爲一個簡單但完整的例子往往是呈現類似的東西的最佳方式。很高興你全都定了下來。 –