Rails 使用 Sinatra 引擎的应用程序 - 如何避免 rails 错误?

Rails App with Sinatra engine - How to avoid rails errors?

问题:当 运行 指定输出时非常混乱,它没有说明错误所在,而是抛出误导性错误

它位于 rails lib 文件夹中,并且安装在 routes.rb

# lib/engines/users/app.rb

module Engines
  module Users
    class App < Sinatra::Base
        get '/api/v1/users/me' do
          raise 'runtime error here'
        end

        get '/api/v1/another-route' do
          # something here
          status 200
        end
    end
  end
end

规范文件看起来像这样:

it 'returns a 200' do
  get '/api/v1/users/me', auth_attributes
  expect(last_response.body).to eq 'something' # added to clarify my point, it's not the response status that I care of.
  expect(last_response.status).to be 200
end

错误:

 Failure/Error: expect(last_response.status).to be 200

   expected #<Fixnum:401> => 200
        got #<Fixnum:1001> => 500

   Compared using equal?, which compares object identity,
   but expected and actual are not the same object. Use
   `expect(actual).to eq(expected)` if you don't care about
   object identity in this example.

预期错误:

     RuntimeError:
       runtime error here

另一条路线也失败了:

it 'something' do
  get '/api/v1/another-route', auth_attributes
  expect(last_response.status).to be 401
  json = JSON.parse(last_response.body).with_indifferent_access
  expect(json[:message]).to eql "You have been revoked access."
end

错误:打印大量 html 输出,我认为这是 rails 回溯 html 输出

预期错误:none 因为此端点不会引发错误

我的问题是是否有办法:

  1. 停止rails处理这个,所以它给出实际输出
  2. 避免整个引擎因为一个路由引发异常而失败

我相信通过解决第一点,第二点也得到解决。

感谢您的宝贵时间

为了解决我的问题,我发现在 spec_helper 上未设置 ENV['RACK_ENV'],将其设置为 test 解决了问题并抛出异常 I需要调试我的代码。

发生这种情况是因为 https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1832

set :show_exceptions, Proc.new { development? }

development? 返回 true 而实际上应该是 false(需要 RACK_ENV 设置来测试)

现在我得到了正确的输出。