Как я могу протестировать действие, которое обрабатывает исключения, используя rack/test на Sinatra?
Я хочу проверить этот маршрут, который я сделал на Синатре:
get '/party' do
begin
party_source.parties
rescue Exceptions::SourceNotFoundError
status 404
rescue Exceptions::SourceInternalError
status 503
end
end
И я написал этот тест (предположим, что party_source доступен для теста, в реальном коде он есть):
require 'rack/test'
def test_correct_status_code_when_get_error_404
source_404 = mock()
source_404.expects(:parties).with(nil).raises(Exceptions::SourceNotFoundError)
MyApp.party_source = source_404
get '/party'
assert_equal 404, last_response.status
end
Когда я запускаю этот тест, он терпит неудачу, потому что вместо 404 (мой код) я получаю статус 500. Независимо от того, какое исключение я поднимаю, я всегда получаю и статус 500, который, я думаю, генерируется Sinatra или Rack.
Как я могу проверить этот случай?
Обновить
Насколько я понимаю, исключения не попадают в мои блоки спасателей. Rack или Sinatra получают его и обрабатывают ответное сообщение HTTP Status 500.
Я не могу понять, как игнорируется мой блок кода спасения.
1 ответ
Вот короткий пример, показывающий, что вы можете протестировать такое действие:
hello_sinatra.rb
:
require 'sinatra/base'
class Hello < Sinatra::Base
get '/party' do
begin
raise StandardError
rescue StandardError
status 404
end
end
end
Hello.run! if __FILE__ == $0
sinatra_test.rb
:
$:.push('.')
require 'hello_sinatra'
require 'test/unit'
require 'rack/test'
ENV['RACK_ENV'] = 'test'
class HelloTest < Test::Unit::TestCase
include Rack::Test::Methods
def app
Hello
end
def test_correct_status_code_when_get_error_404
get '/party'
assert_equal 404, last_response.status
end
end
Однако что-то выглядит странно в вашем коде. Вы можете попробовать заменить MyApp.party_source = source_404
с app.party_source = source_404
Обновить
Ты только ловишь Exceptions::SourceNotFoundError
а также Exceptions::SourceInternalError
, что-то еще, вероятно, идет не так, как надо, что дает ошибку 500.
Добавьте ловушку в конце вашего блока начала / спасения, используя rescue Exception
и вы быстро увидите, где проблема.