Как я могу протестировать действие, которое обрабатывает исключения, используя 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 и вы быстро увидите, где проблема.

Другие вопросы по тегам