4

このインターセプターをテストする方法はありますか? 私のテストでは無視されています。

コード:

class BaseDomainController {
    def beforeInterceptor = {
        throw new RuntimeException()
        if(!isAdmin()){
            redirect(controller: 'login', action: 'show')
            return
        }
    }
}

class BaseDomainControllerSpec extends IntegrationSpec{

    BaseDomainController controller = new BaseDomainController()

    def 'some test'(){
        given: 
            controller.index()
        expect:
            thrown(RuntimeException)
    }

}
4

2 に答える 2

3

このスレッドhttp://grails.1312388.n4.nabble.com/Controller-interceptors-and-unit-tests-td1326852.htmlによると、 Graeme はインターセプターを個別に呼び出す必要があることを示しています。私たちの場合、インターセプターを使用してトークンをチェックしており、すべてのアクションで同じであるため、以下を使用しました。

@Before
void setUp() 
{
    super.setUp();
    controller.params.token = "8bf062eb-ec4e-44ae-8872-23fad8eca2ce"
    if (!controller.beforeInterceptor())
    {
        fail("beforeInterceptor failed");
    }    
} 

各単体テストでインターセプターに異なる引数が指定されている場合は、毎回個別に呼び出す必要があると思います。これをしたくない場合は、ライフサイクル全体を通過する Grail の機能テストのようなものを使用する必要があると思います: http://grails.org/plugin/functional-test

于 2012-09-28T18:28:22.147 に答える
1

Grails のドキュメントには次のように記載されています。

Grails は、統合テスト中にアクションを呼び出すときに、インターセプターまたはサーブレット フィルターを呼び出しません。必要に応じて機能テストを使用して、インターセプターとフィルターを分離してテストする必要があります。

これは単体テストにも当てはまります。コントローラーのアクションは、定義されたインターセプターの影響を受けません。

あなたが持っていると仮定すると:

    def afterInterceptor = [action: this.&interceptAfter, only: ['actionWithAfterInterceptor','someOther']]

    private interceptAfter(model) { model.lastName = "Threepwood" }

インターセプターをテストするには、次のことを行う必要があります。

目的のアクションにインターセプトが適用されていることを確認する

void "After interceptor applied to correct actions"() {

    expect: 'Interceptor method is the correct one'
    controller.afterInterceptor.action.method == "interceptAfter"

    and: 'Interceptor is applied to correct action'
    that controller.afterInterceptor.only, contains('actionWithAfterInterceptor','someOther')
}

インターセプター メソッドが目的の効果を持つことを確認する

void "Verify interceptor functionality"() {

    when: 'After interceptor is applied to the model'
    def model = [firstName: "Guybrush"]
    controller.afterInterceptor.action.doCall(model)

    then: 'Model is modified as expected'
    model.firstName == "Guybrush"
    model.lastName == "Threepwood"
}

または、インターセプターがない場合は、何もないことを確認します

void "Verify there is no before interceptor"() {
    expect: 'There is no before interceptor'
    !controller.hasProperty('beforeInterceptor')
}

これらの例は、インターセプターの後にテストするためのものでしたが、インターセプターの前にも同じことが適用されます。

于 2014-08-03T16:42:44.457 に答える