Выявление 500 ошибок преднамеренно в Синатре, чтобы проверить, как они обрабатываются - PullRequest
3 голосов
/ 16 июня 2019

Я хочу написать тест RSpec, который проверяет, что в случае ошибки 500 в моем API на базе Sinatra ошибка будет обнаружена определением Sinatra error и возвращена клиенту в формате JSON. То есть вместо того, чтобы возвращать какую-либо страницу с ошибкой HTML, она возвращает JSON, как этот, чтобы соответствовать остальной части API:

{
  success: "false",
  response: "Internal server error"
}

Однако я не уверен, как на самом деле вызвать ошибку 500 в моем приложении Sinatra, чтобы протестировать это поведение с помощью RSpec. Я не могу найти способ издеваться над маршрутами Синатры, поэтому в настоящее время моя лучшая идея - этот маршрут, который намеренно вызывает 500. Это похоже на довольно ужасное решение:

get '/api/v1/testing/internal-server-error' do
  1 / 0
end

Есть ли способ смоделировать маршруты Синатры, чтобы я мог, скажем, с помощью блока обработчика маршрутов / вызвать исключение, следовательно, вызвать 500? Если нет, есть ли какой-либо другой способ намеренно вызвать ошибку 500 в моем приложении?

Ответы [ 2 ]

1 голос
/ 16 июня 2019

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

Используйте метод halt:

require 'sinatra'

get '/' do
  halt 500, {
    success: 'false',
    response: 'Internal server error'
  }.to_json
end
...