現在、Grails 1.3.7アプリを2.1.0にアップグレードし、テストしたいフィルタセットを用意しています。 grails documentation for testing filtersは、フィルタのユニットテストがサポートされていることを示しています(機能的な部分で述べられていますが、サンプルが見つからないことをお勧めします)、フィルタの既存の統合テストをユニットテストに変換しようとしています。Grails 2.0ユニットテストフィルタ:サービスインジェクションとdependsOn
しかし、私はこのフィルタを正しく模倣するのに苦労しています。このフィルタdependsOn
/は、フィルタを注入されているservice
のモックを少なくとも適切に実装しています。
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
}
}
}
}
そして、他のフィルタ:
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
}
}
}
}
これは本当に誰でも好奇心旺盛だ場合(、彼らはデスクトップの好み対モバイルを読み、フィルター私が働いている2つのフィルタの簡略化されたバージョンをスケルトンで、その好みに基づいて)。
だから私は書いているテストは、おおよそ次のようになります。
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
}
}
このコードは、現状では、それもMyFilters
コードを実行しません。私はモックAlaへの依存フィルタを追加しようとしました:
@Mock([MyFilters, MyOtherFilters])
しかし、私は定義されていないSomeOtherService
方法の問題に実行し、適切にそれらのメソッドをモックする方法を発見していない(私はどのようにあなたはコントローラまたはサービスのコントローラ上でサービスモックを設定することができますdef myMock = mockFor(SomeOtherService)
そしてcontroller.someOtherService = myMock.createMock()
または何かの並べ替えを行うが、私はこのwithFilters
ブロックを使用してフィルタを使用してフィルタのサービスを設定する方法を見つけることができません
理想的には、私はsomeService
とMyOtherFilters
と何かを嘲笑し、このフィルタをテストしますが、テストフィルタで可能なことは確認できません。
洞察力は非常に高く評価されます。