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 不会调用拦截器或 servlet 过滤器。您应该单独测试拦截器和过滤器,必要时使用功能测试。

这也适用于单元测试,您的控制器操作不受定义的拦截器的影响。

鉴于您有:

    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 回答