2012-12-12 15 views
9

Próbuję napisać testy jednostkowe dla usługi, która używa pliku grailsApplication.config do wykonania niektórych ustawień. Wygląda na to, że w mojej jednostce testy tej instancji usługi nie mogły uzyskać dostępu do pliku konfiguracyjnego (wskaźnik zerowy) dla jego ustawienia, podczas gdy mógł on uzyskać dostęp do tego ustawienia, gdy uruchomię "run-app". Jak mogę skonfigurować usługę, aby uzyskać dostęp do usługi GrailsApplication w moich testach jednostkowych.grails Dostęp do aplikacji w jednostce 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

Masz TestFor ani żadnej adnotacji w tym teście? Nie redeclare grailsApplication, the mock pochodzi z adnotacją. Zobacz 'GrailsUnitTestMixin'. –

+0

yes Ma adnotację @TestFor. Usunąłem "def grailsApplication", ale otrzymałem komunikat o wartości pustej na obiekcie GrailsApplication. BTW Używam Graala 2.1. – Reza

+0

Czy możesz opublikować stacktrace? Ponadto nie mam pewności, że możesz zadeklarować taką konfigurację, ponieważ jest to instancja klasy ConfigObject. Zrobię test i zobaczę, czy będziesz musiał użyć ConfigSlurper. –

Odpowiedz

19

Jeśli używasz @TestFor Grails (2.0) już makiety grailsApplication dla Ciebie, wystarczy ustawić swoje pliki konfiguracyjne, ale nie deklarują grailsApplication. Powoduje to przesłonięcie wyśmiewanej instancji.

@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:

Ty ogłoszony String, aby dodać do config należy analizować to. Zobacz przykład here.

Zasadniczo używasz ConfigSlurper().parse(), aby uzyskać ConfigObject i użyć grails.config.merge(), aby dodać zawartość do konfiguracji.

+0

Zrobiłem test jednostki serwisowej przed i działa. Teraz użyłem tej usługi w kontrolerze. Chcę przetestować kontroler, który korzysta z tej usługi. Wygląda na to, że nie mogłem ustawić grailsApplication (dla usługi), aby przetestować funkcjonalność kontrolera. Jakieś sugestie? – Reza

+0

Po prostu utwórz usługę podobną do tego przykładu i ustaw ją bezpośrednio w instancji kontrolera. –

+0

Zrobiłem to samo, o czym wspomniałeś, ale otrzymałem komunikat "Nie mogę ustawić właściwości 'config' na obiekcie zerowym". – Reza

4

Skonstruowanie grailsApp przy użyciu DefaultGrailsApplication zadziała. konfiguracyjny

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

Idź Do http://ilikeorangutans.github.io/2014/02/06/grails-2-testing-guide

GRAILS’ jest zazwyczaj obsługiwany przez wstrzykiwany przykładowo z GrailsApplication pomocą właściwości konfiguracyjnych. Grails wstrzykuje GrailsApplication do testów jednostkowych, dzięki czemu można do niego dostęp bezpośrednio:

@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 
    } 

}