Исключения модульного тестирования с RequestFixture и HandlingResult в Ratpack

Так что я знаю, как правильно проверять, когда выдается исключение, в моих тестах модуля обработки.

Однако каков правильный подход, когда я хочу убедиться, что исключение не было выдано?

Это лучшее, что я придумал до сих пор:

def "No exception is thrown"() {
    given:
    def noExceptionThrown = false

    when:
    def result =  RequestFixture.handle(new TestEndpoint(), { fixture -> fixture.uri("path/a)})

    then:
    try {
        result.exception(CustomException)
    } catch(ratpack.test.handling.HandlerExceptionNotThrownException e) {
        noExceptionThrown = (e != null)
    }

    noExceptionThrown
}

1 ответ

Решение

Вы можете немного переупорядочить код, так что вы можете использовать Spock's thrown метод:

def "No exception is thrown"() {
    given:
    def result =  RequestFixture.handle(new TestEndpoint(), { fixture -> fixture.uri("path/a)})

    when:
    result.exception(CustomException)

    then:
    thrown(HandlerExceptionNotThrownException)
}

Другой вариант - использовать в тестах собственный обработчик ошибок и добавить его в реестр устройства. У пользовательского обработчика ошибок могут быть методы, чтобы указать, выброшено исключение или нет. Смотрите следующий пример:

package sample

import ratpack.error.ServerErrorHandler
import ratpack.handling.Context
import ratpack.handling.Handler
import ratpack.test.handling.RequestFixture
import spock.lang.Specification

class HandlerSpec extends Specification {

    def 'check exception is thrown'() {
        given:
        def errorHandler = new TestErrorHandler()

        when:
        RequestFixture.handle(new SampleHandler(true), { fixture -> 
            fixture.registry.add ServerErrorHandler, errorHandler
        })

        then:
        errorHandler.exceptionThrown()

        and:
        errorHandler.throwable.message == 'Sample exception'
    }

    def 'check no exception is thrown'() {
        given:
        def errorHandler = new TestErrorHandler()

        when:
        RequestFixture.handle(new SampleHandler(false), { fixture ->
            fixture.registry.add ServerErrorHandler, errorHandler
        })

        then:
        errorHandler.noExceptionThrown()
    }

}

class SampleHandler implements Handler {

    private final boolean throwException = false

    SampleHandler(final boolean throwException) {
        this.throwException = throwException
    }

    @Override
    void handle(final Context ctx) throws Exception {
        if (throwException) {
            ctx.error(new Exception('Sample exception'))
        } else {
            ctx.response.send('OK')
        }
    }

}

class TestErrorHandler implements ServerErrorHandler {

    private Throwable throwable

    @Override
    void error(final Context context, final Throwable throwable) throws Exception {
        this.throwable = throwable
        context.response.status(500)
        context.response.send('NOK')
    }

    boolean exceptionThrown() {
        throwable != null
    }

    boolean noExceptionThrown() {
        !exceptionThrown()
    }
}
Другие вопросы по тегам