我想写一个RSpec测试来验证,如果我的Sinatra支持的API500出现错误,错误将被Sinatra定义捕获,并以error格式返回给客户机。也就是说,它不是返回一些HTML错误页面,而是像这样返回JSON,以符合API的其余部分:
{
success: "false",
response: "Internal server error"
}然而,我不确定如何在我的Sinatra应用程序中触发500错误,以便用RSpec测试这一行为。我找不到一种方法来模拟Sinatra路由,所以目前我最好的想法是这个路由故意导致500。这感觉像是一个非常糟糕的解决方案:
get '/api/v1/testing/internal-server-error' do
1 / 0
end有没有一种方法可以模拟Sinatra路由,这样我就可以,比如说,让/的路由处理程序块引发异常,从而触发500?如果没有,是否有其他方法可以故意在我的应用程序中导致500错误?
发布于 2019-06-17 00:39:59
在面对这样的情况时,我通常做的是分离关注点,并将逻辑移出Sinatra get ...块。然后,很容易将其存根并使其引发错误。
例如,给定以下服务器代码:
# server.rb
require 'sinatra'
class SomeModel
def self.some_action
"do what you need to do"
end
end
get '/' do
SomeModel.some_action
end然后,您可以使用此代码让模型或用于实际生成响应的任何其他类/函数引发错误,使用此规范:
# spec
describe '/' do
context 'on error' do
before do
allow(SomeModel).to receive(:some_action) { raise ArgumentError }
end
it 'errors gracefully' do
get '/'
expect(last_response.status).to eq 500
end
end
end为了完整起见,下面是一个自包含的文件,可以通过运行rspec thisfile.rb对该文件进行测试,以演示这种方法
# thisfile.rb
require 'rack/test'
require 'rspec'
require 'sinatra'
# server
class SomeModel
def self.some_action
"do what you need to do"
end
end
get '/' do
SomeModel.some_action
end
# spec_helper
ENV['APP_ENV'] = 'test'
module RSpecMixin
include Rack::Test::Methods
def app() Sinatra::Application end
end
RSpec.configure do |c|
c.include RSpecMixin
end
# spec
describe '/' do
context 'on error' do
before do
allow(SomeModel).to receive(:some_action) { raise ArgumentError }
end
it 'errors gracefully' do
get '/'
expect(last_response.status).to eq 500
end
end
end发布于 2019-06-16 15:27:04
使用halt方法:
require 'sinatra'
get '/' do
halt 500, {
success: 'false',
response: 'Internal server error'
}.to_json
endhttps://stackoverflow.com/questions/56614526
复制相似问题