如何在Sinatra上测试使用机架/测试处理异常的操作?

时间:2011-08-26 17:29:07

标签: ruby unit-testing sinatra rack

我想测试我在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生成的。 / p>

我该如何测试这个案例?

更新

正如我所理解的那样,例外并没有被我的救援块所抓住。 Rack或Sinatra正在获取它并处理HTTP Status 500响应消息。

我无法理解我的救援代码块是如何被忽略的。

1 个答案:

答案 0 :(得分: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::SourceNotFoundErrorExceptions::SourceInternalError,你的模拟中可能出现其他问题,这会产生500错误。

使用rescue Exception在您的开始/救援区块的末尾添加一个垃圾邮件,您将很快看到问题所在。