Ruby 如何测试是否正在使用某些特定的机架中间件?

Ruby 如何测试是否正在使用某些特定的机架中间件?,ruby,testing,sinatra,rack,sentry,Ruby,Testing,Sinatra,Rack,Sentry,更具体地说,我在这里谈论的是哨兵乌鸦和辛纳特拉。我看到了测试sinatra应用程序或中间件的示例。但我没有看到有人测试是否存在某个特定的中间件。或者我应该测试行为,而不是配置(或者我应该如何称呼它)?重要的是行为(我会说),但是如果您希望检查中间件,在深入研究之后,我建议有两种方法(可能有更简单/更好的方法): 环境 在Sinatra资料来源中: 只有当它在env散列中插入了一些东西时,它才会显示中间件,例如 class MyBad def initialize app, options={

更具体地说,我在这里谈论的是哨兵乌鸦和辛纳特拉。我看到了测试
sinatra
应用程序或中间件的示例。但我没有看到有人测试是否存在某个特定的中间件。或者我应该测试行为,而不是配置(或者我应该如何称呼它)?

重要的是行为(我会说),但是如果您希望检查中间件,在深入研究之后,我建议有两种方法(可能有更简单/更好的方法):

环境 在Sinatra资料来源中:

只有当它在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"]
self.middleware = [[MyBad, [], nil]]
就在那张单子的末尾

中间件方法 :

在模块化应用程序的类定义中调用它,您可以获得阵列中的中间件:

require 'sinatra/base'

class AnExample < Sinatra::Base
  use MyBad
  warn "self.middleware = #{self.middleware}"
可能有一种方法可以从Sinatra::Application获得它,但我还没有查看。

在来自的帮助下,我们得到了以下结果:

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
和mock
Raven。改为发送或跳过:

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

我没有坚持要测试而不是行为。如果中间件以某种方式表现出来,可以考虑使用中间件。此外,我还从
ravenruby
人那里得到了一些信息。我还没有检查它。@x-yuri如果它以某种方式表现出来,那么它会影响行为,你可以检查一下。如果它不影响行为,那么问题在哪里?“我没有坚持测试而不是行为。”我不知道这意味着什么。
如果它以某种方式表现出来,那么它会影响行为,你可以检查它。
所以我问如何检查它。不过,我可能还不够清楚<代码>我不知道这意味着什么。
我很乐意任何人在这里告诉我如何测试行为,而不是状态(或配置,或其他任何内容)。@x-yuri您链接到的问题线程中的问题是好的,可能如果您将此解决方案添加到您的答案中,我会接受它。
self.middleware = [[MyBad, [], nil]]
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.configure(true) do |config|
  config.should_send = Proc.new { false }
end
...
allow(Raven).to receive(:send_or_skip).and_return(true)
begin
  get '/'
rescue TestRavenError
end
expect(Raven).to have_received(:send_or_skip)
...