2012-12-12 15 views
9

Sto provando a scrivere test unitari per un servizio che utilizza grailsApplication.config per eseguire alcune impostazioni. Sembra che nella mia unità test quell'istanza di servizio non abbia potuto accedere al file di configurazione (puntatore nullo) per le sue impostazioni mentre poteva accedere a quell'impostazione quando eseguivo "run-app". Come posso configurare il servizio per accedere al servizio GrailsApplication nei miei test di unità.grails Accesso alle applicazioni nell'unità Grails Test

class MapCloudMediaServerControllerTests { 

    def grailsApplication 

    @Before 
    public void setUp(){ 
     grailsApplication.config= 
     ''' 
    video{ 
    location="C:\\tmp\\" // or shared filesystem drive for a cluster 

    yamdi{ 
     path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\yamdi" 
     } 

    ffmpeg { 
     fileExtension = "flv" // use flv or mp4 
     conversionArgs = "-b 600k -r 24 -ar 22050 -ab 96k" 
     path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\ffmpeg" 
     makethumb = "-an -ss 00:00:03 -an -r 2 -vframes 1 -y -f mjpeg" 
    } 

    ffprobe { 
     path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\ffprobe" 
     params="" 
    } 

    flowplayer { 
     version = "3.1.2" 
    } 

    swfobject { 
     version = "" 

    qtfaststart { 
     path= "C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\qtfaststart" 
    } 
} ''' 
    } 

@Test 
    void testMpegtoFlvConvertor() { 

     log.info "In test Mpg to Flv Convertor function!" 

     def controller=new MapCloudMediaServerController() 
     assert controller!=null 

     controller.videoService=new VideoService() 
     assert controller.videoService!=null 

     log.info "Is the video service null? ${controller.videoService==null}" 

     controller.videoService.grailsApplication=grailsApplication 

     log.info "Is grailsApplication null? ${controller.videoService.grailsApplication==null}" 

     //Very important part for simulating the HTTP request 
     controller.metaClass.request = new MockMultipartHttpServletRequest() 
     controller.request.contentType="video/mpg" 
     controller.request.content= new File("..\\MapCloudMediaServer\\web-app\\videoclips\\sample3.mpg").getBytes() 

     controller.mpegtoFlvConvertor() 

     byte[] videoOut=IOUtils.toByteArray(controller.response.getOutputStream()) 
     def outputFile=new File("..\\MapCloudMediaServer\\web-app\\videoclips\\testsample3.flv") 
     outputFile.append(videoOut) 
    } 
} 
+0

Hai la TestFor o qualsiasi annotazione in questo test? Non redeclare grailsApplication, il mock viene fornito con l'annotazione. Vedi 'GrailsUnitTestMixin'. –

+0

sì Ha annotazione @TestFor. Ho rimosso "def grailsApplication" ma ho ottenuto il messaggio null sull'oggetto grailsApplication. BTW sto usando Grail 2.1. – Reza

+0

Puoi pubblicare lo stacktrace? Inoltre, non sono sicuro di poter dichiarare la configurazione come questa, perché è un'istanza di ConfigObject. Farò un test e vedrò se sarà necessario usare ConfigSlurper. –

risposta

19

Se si utilizza @TestFor Grails (2.0) grailsApplication già finto per voi, basta impostare le file di configurazione, ma non si dichiara il grailsApplication. In questo modo si ignora l'istanza derisoria.

@TestFor(MyService) 
class MyServiceTests { 

    @Before 
    public void setUp() { 
    grailsApplication.config.something = "something" 
    } 

    @Test 
    void testSomething() { 
    MyService service = new MyService() 
    service.grailsApplication = grailsApplication 
    service.doSomething() 
    } 


} 

EDIT:

È dichiarata String, da aggiungere a config è necessario analizzare questo. Vedi here un esempio.

In pratica si utilizza ConfigSlurper().parse() per ottenere un ConfigObject e si utilizza grails.config.merge() per aggiungere i contenuti alla configurazione.

+0

Ho fatto il test dell'unità di servizio prima e funziona. Ora ho usato quel servizio in un controller. Voglio testare il controller che usa quel servizio. Sembra che non sia stato possibile impostare grailsApplication (per il servizio) per testare la funzionalità del controller. Eventuali suggerimenti? – Reza

+0

Basta creare il servizio come questo esempio e impostare direttamente nell'istanza del controller. –

+0

Ho fatto lo stesso modo in cui hai menzionato ma ho ricevuto il messaggio "Impossibile impostare la proprietà 'config' su un oggetto nullo". – Reza

4

La costruzione di grailsApp con DefaultGrailsApplication funzionerebbe. config

class ZazzercodeUnitTestCase extends GrailsUnitTestCase { 
    def grailsApplication = new org.codehaus.groovy.grails.commons.DefaultGrailsApplication() 
    def chortIndex= grailsApplication.config.zazzercode.chortIndex 
} 
0

Vai al http://ilikeorangutans.github.io/2014/02/06/grails-2-testing-guide

Grails’ è solitamente accede tramite un'istanza iniettato GrailsApplication utilizzando la proprietà di configurazione. Grails inietta GrailsApplication in test di unità, in modo da poter accedere direttamente:

@TestMixin(GrailsUnitTestMixin) 
class MySpec extends Specification {   
    private static final String VALUE = "Hello" 
    void "test something with config"() { 
     setup: 
     // You have access to grailsApplication.config so you can 
     //modify these values as much as you need, so you can do 
     grailsApplication.config.myConfigValue = VALUE 

     assert:    
     grailsApplication.config.myConfigValue == VALUE 
    } 

}