2013-03-06 7 views
7

Obecnie aktualizujemy grę grails 1.3.7 do wersji 2.1.0 i mam zestaw filtrów, które chciałbym przetestować. Patrząc, jak grails documentation for testing filters sugeruje, że Testowanie Jednostek dla filtrów jest teraz obsługiwane (zalecane jest, że jest wymienione w części funkcjonalnej, ale nie znajduje przykładów), próbuję przekonwertować niektóre istniejące testy integracji dla filtra na testy jednostkowe.Grails 2.0 Filtry do testów jednostkowych: wtrysk serwisowy i zależy od

Jednak staram się poprawnie "wyśmiewać" filtr ten filtr dependsOn/co najmniej prawidłowo zaimplementować próbę dla niektórych service s, które są wstrzykiwane filtry.

package com.example 

import ... // excluded for brevity 


class MyFilters { 

    GrailsApplication grailsApplication 
    SomeService someService 

    def dependsOn = [MyOtherFilters] 


    def filters = { 
     all(controller: 'controllerToExclude', invert: true) { 
      before = { 
       if (grailsApplication.config.someConfigProperty) { 
        def someProperty = request.getAttribute('MY_ATTRIBUTE') 

        if (someProperty = someService.someMethod()) { 
         redirect(url: someService.getNewUrl(session)) 
         return false 
        } 
       } 
       return true 
      } 
     } 
    } 
} 

A drugi filtr:

package com.example 

class MyOtherFilters { 

    SomeOtherService someOtherService 

    def filters = { 
     all(controller: '*', action: '*') { 
      before = { 
       def foo 

       if (params[MY_ATTRIBUTE]) { 
        foo = params[MY_ATTRIBUTE] 
        someOtherService.setMyAttribute(sitePreference, request) 
       } 

       if (!foo) { 
        foo = someOtherService.getMyAttribute(request) 
       } 

       if (foo) { 
        request.setAttribute('MY_ATTRIBUTE', foo) 
       }  

       return true 
      } 
     } 
    } 
} 

To jest naprawdę Szkielet uproszczona wersja z dwoma filtrami pracuję z (jeśli ktoś jest ciekawy, czytają mobilne vs preferencji pulpitu, a następnie filtrować w oparciu o tę preferencję).

Więc test Piszę wygląda mniej więcej tak:

package com.example 

import grails.test.mixin.TestFor // ... etc more imports here 

@TestFor(SomeController) 
@Mock(MyFilters) // TODO what goes here??? 
class MyFiltersTests { 

    static final IPAD_USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X; en-us) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3' 
    static final NON_MOBILE_USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00' 


    void testFilterRedirects() { 
     grailsApplication.config.someConfigProperty = true 
     // actual filter logic acts on this user-agent through some service calls, would like to mock it out though  
     request.addHeader("user-agent", IPAD_USER_AGENT) 
     def result 

     withFilters(action: "index") { 
      result = controller.index() 
     } 

     //assertSomething on result perhaps 
     assertEquals "myExpectedRedirectUrl", response.redirectedUrl 
    } 
} 

Ponieważ kod ten oznacza, że ​​nie ma nawet wykonać kod MyFilters. Próbowałem dodawanie filtrów zależnych do ala kpiącym:

@Mock([MyFilters, MyOtherFilters]) 

Ale potem napotkasz problemy z SomeOtherService metod nie jest określony, a nie znaleźli sposób wyśmiewać tych metod prawidłowo (jak mogę ustawmy kroje serwisowe na filtrze? na kontrolerze lub usłudze, którą możesz def myMock = mockFor(SomeOtherService), a następnie wykonaj controller.someOtherService = myMock.createMock() lub coś w tym rodzaju, ale nie mogę znaleźć sposobu ustawienia usługi dla filtra z tym blokiem withFilters, który sugeruje użycie dokumentacji

Idealnie byłoby kpić z wszystkiego co związane z someService i MyOtherFilters, i po prostu pisząc przetestuj na tym filtrze, ale nie wiesz, co jest możliwe w/testowaniu filtrów.

Każdy wgląd byłby bardzo doceniony, bardzo dziękuję, jeśli dotarłeś tak daleko!

Odpowiedz

2

Mają ten sam problem. Jest to błąd podniesiony w Grails Jira http://jira.grails.org/browse/GRAILS-8976

znalazłem obejście w http://delvingintodev.carrclan.us/2012/12/testing-grails-filters-that-use-services.html „Testowanie Grails filtry, które korzystają z usług ”

Zasadniczo trzeba korzystać z usługi w filtrze następująco

package xxx.me 

class MyFilters { 
    def filters = { 
     all(controller:'*', action:'*') { 
      before = { 
       applicationContext.getBean(MyService).doSomethingClever() 
      } 
     } 
    } 
} 

w tym W przypadku testów jednostkowych będzie można je udawać w testach jednostkowych:

package xxx.me 

@TestMixin(GrailsUnitTestMixin) 
@Mock(MyFilters) 
class MyFiltersTests { 

    @Test 
    public void testFilter(){ 
     defineBeans { 
      myService(StubbedMyService) 
     } 
     SimpleController controller = mockController(SimpleController); 

     withFilters(controller:"simple" , action:"index"){ 
      controller.index()  
     } 
    } 
} 

class StubbedMyService extends MyService { 
    def doSomethingClever(){ 
    } 
}