Исключения модульного тестирования с 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()
}
}