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
和mockRaven。改为发送或跳过:
...
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)
...