gpt4 book ai didi

ruby - 如何测试是否正在使用某些特定的 Rack 中间件?

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

更具体地说,我在这里谈论的是 sentry-ravensinatra。我看到了测试 sinatra 应用程序或中间件的示例。但是我没有看到有人测试是否存在某些特定的中间件。或者我应该测试行为,而不是配置(或者我应该如何调用它)?

最佳答案

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

环境

在 Sinatra 源代码中 there's a method that uses the env to check if a middleware is already present :

# 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 hash 中插入了一些东西,它只会向你显示中间件,例如

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"]

它接近该列表的末尾。

中间件方法

There's also a method called middleware in Sinatra::Base :

  # 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 获取它,但我没看过。

关于ruby - 如何测试是否正在使用某些特定的 Rack 中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27910729/

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