2013-03-06 8 views
7

現在、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ブロックを使用してフィルタを使用してフィルタのサービスを設定する方法を見つけることができません

理想的には、私はsomeServiceMyOtherFiltersと何かを嘲笑し、このフィルタをテストしますが、テストフィルタで可能なことは確認できません。

洞察力は非常に高く評価されます。

答えて

2

同じ問題があります。 GrailsのJiraので提起されたバグがありhttp://jira.grails.org/browse/GRAILS-8976

私はこれで

package xxx.me 

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

を次のようにあなたは基本的には、フィルタでサービスを使用する必要が

http://delvingintodev.carrclan.us/2012/12/testing-grails-filters-that-use-services.html [サービス を使用してテストGrailsのフィルタ "で回避策を見つけましたあなたはユニットテストでそれを嘲笑することができるでしょう

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(){ 
    } 
} 
関連する問題