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!