gpt4 book ai didi

ruby - 在 Sinatra 中故意引发 500 个错误以测试它们的处理方式

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:39 24 4
gpt4 key购买 nike

我想编写一个 RSpec 测试来验证,如果在我的 Sinatra 支持的 API 中发生 500 错误,该错误将被 Sinatra error 定义捕获并返回给客户端JSON 格式。也就是说,它不会返回一些 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 路由,这样我就可以让 / 的路由处理程序 block 引发异常,从而触发 500?如果不是,是否有其他方法可以故意在我的应用程序中导致 500 错误?

最佳答案

面对这样的情况,我通常做的是分离关注点,并将逻辑移到 Sinatra get ... block 之外。然后,很容易对其进行 stub 并使其引发错误。

例如,给定此服务器代码:

# 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

关于ruby - 在 Sinatra 中故意引发 500 个错误以测试它们的处理方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56614526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com