2017-03-09 54 views
0

我正在嘗試編寫Grails Web插件的測試。該插件包含一個服務(UtilityService),該服務具有一個名爲getSession()的函數,該函數返回GrailsHttpSession。其他服務使用它來讀取/寫入會話中的值。代碼工作得很好,但是當我嘗試爲使用返回的會話對象的任何函數編寫測試時,測試失敗。如何測試從HTTP會話中檢索信息的Grails服務

我在這一點上的目標是簡單地寫一個測試,證明utilityService.getSession()返回的東西。

我目前工作的Grails 3.2.7

UtilityService:

package psu.util 

import grails.transaction.Transactional 
import grails.core.GrailsApplication 
import grails.util.Environment 

import grails.core.* 
import org.grails.web.util.WebUtils 
import org.springframework.web.context.request.RequestContextHolder 
import javax.servlet.http.HttpServletRequest 

@Transactional 
class UtilityService { 
    GrailsApplication grailsApplication 

    @Transactional(readOnly = true) 
    grails.web.servlet.mvc.GrailsHttpSession getSession(){ 
     return WebUtils.retrieveGrailsWebRequest()?.session 
    } 

} 

測試:

package psu.util 

import grails.test.mixin.TestFor 
import grails.test.mixin.integration.Integration 
import grails.transaction.* 
import spock.lang.* 

@Integration 
@Rollback 
@TestFor(UtilityService) 
class UtilityServiceIntegrationSpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test getSession"() { 
     expect: 
     service.getSession() 
    } 
} 

測試輸出:

Condition not satisfied: 

service.getSession() 
|  | 
|  null 
[email protected] 

問題: 有什麼我需要做的,使會議在測試環境中可用?是否有可能在單元測試中做到這一點,還是必須進行集成測試?

+0

無關你的問題,但你並不需要一個交易來獲得一個會話,你打開一個到數據庫的連接,併爲你的'getSession()'做任何事情 – erichelgeson

回答

0

最簡單的方法是嘲笑的getSession方法並返回會話模擬(或Grails的GrailsMockHttpSession),其作爲在Groovy簡單:

@TestFor(SessionService) 
class SessionMockSpec extends Specification { 

    GrailsHttpSession session 

    def setup() { 
     session = Mock() 
     service.metaClass.getSession = { session } 
    } 

    def 'should return session'() { 
     expect: 
      service.getSession() 
    } 
相關問題