Как проверить, используется ли какое-то конкретное промежуточное программное обеспечение для стойки?

Чтобы быть более конкретным, я говорю о sentry-raven а также sinatra Вот. Я видел примеры тестирования sinatra приложения или промежуточное программное обеспечение. Но я не видел, чтобы кто-нибудь тестировал наличие какого-то определенного промежуточного программного обеспечения. Или я должен тестировать поведение, а не конфигурацию (или как это назвать)?

2 ответа

Решение

С помощью ruby-raven ребята, у нас есть это:

ENV['RACK_ENV'] = 'test'

# the app: start

require 'sinatra'
require 'sentry-raven'

Raven.configure(true) do |config|
  config.dsn = '...'
end

use Raven::Rack

get '/' do
  'Hello, world!'
end

# the app: end

require 'rspec'
require 'rack/test'

Raven.configure do |config|
  logger = ::Logger.new(STDOUT)
  logger.level = ::Logger::WARN
  config.logger = logger
end

describe 'app' do
  include Rack::Test::Methods

  def app
    @app || Sinatra::Application
  end

  class TestRavenError < StandardError; end

  it 'sends errors to sentry' do
    @app = Class.new Sinatra::Application do
      get '/' do
        raise TestRavenError
      end
    end
    allow(Raven.client).to receive(:send).and_return(true)
    begin
      get '/'
    rescue TestRavenError
    end
    expect(Raven.client).to have_received(:send)
  end
end

Или если raven мешает отправка запросов (когда тесты не пройдены из-за raven отправка запросов, а не из-за основной ошибки) их можно отключить:

Raven.configure(true) do |config|
  config.should_send = Proc.new { false }
end

И издеваться Raven.send_or_skip вместо:

...
allow(Raven).to receive(:send_or_skip).and_return(true)
begin
  get '/'
rescue TestRavenError
end
expect(Raven).to have_received(:send_or_skip)
...

Важная вещь (я бы сказал) - это поведение, но если вы хотите проверить наличие промежуточного программного обеспечения, я бы посоветовал после изучения источника Sinatra два пути (возможно, есть гораздо более простые / лучшие способы):

Конверт

В источнике Синатры есть метод, который использует env для проверки наличия промежуточного программного обеспечения:

# Behaves exactly like Rack::CommonLogger with the notable exception that it does nothing,
# if another CommonLogger is already in the middleware chain.
class CommonLogger < Rack::CommonLogger
  def call(env)
    env['sinatra.commonlogger'] ? @app.call(env) : super
  end

Вы можете сделать то же самое в маршруте, например,

get "/env-keys" do
  env.keys.inspect
end

Он покажет вам промежуточное ПО, только если что-то вставлено в хеш env, например

class MyBad
  def initialize app, options={}
    @app = app
    @options = options
  end

  def call env
    @app.call env.merge("mybad" => "I'm sorry!")
  end
end

выход:

["SERVER_SOFTWARE", "SERVER_NAME", "rack.input", "rack.version", "rack.errors", "rack.multithread", "rack.multiprocess", "rack.run_once", "REQUEST_METHOD", "REQUEST_PATH", "PATH_INFO", "REQUEST_URI", "HTTP_VERSION", "HTTP_HOST", "HTTP_CONNECTION", "HTTP_CACHE_CONTROL", "HTTP_ACCEPT", "HTTP_USER_AGENT", "HTTP_DNT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "GATEWAY_INTERFACE", "SERVER_PORT", "QUERY_STRING", "SERVER_PROTOCOL", "rack.url_scheme", "SCRIPT_NAME", "REMOTE_ADDR", "async.callback", "async.close", "rack.logger", "mybad", "rack.request.query_string", "rack.request.query_hash", "sinatra.route"]

Это ближе к концу этого списка.

Метод промежуточного программного обеспечения

Там также есть метод middleware в Синатре:: База:

  # Middleware used in this class and all superclasses.
  def middleware
    if superclass.respond_to?(:middleware)
      superclass.middleware + @middleware
    else
      @middleware
    end
  end

Назовите его в определении класса модульного приложения, и вы можете получить промежуточное программное обеспечение в массиве:

require 'sinatra/base'

class AnExample < Sinatra::Base
  use MyBad
  warn "self.middleware = #{self.middleware}"

выход:

self.middleware = [[MyBad, [], nil]]

Возможно, есть способ получить его из Sinatra:: Application, но я не посмотрел.

Другие вопросы по тегам