ruby - 如何将 Rack 中间件注入(inject)现有的 Rack 应用程序?

标签 ruby rack middleware rack-middleware

给定一个非 Rails 的 Rack 应用程序,

构建器.rb:

def app
  Rack::Builder.new{
    use Rack::Static, urls:static_paths, root:'public'

    run ThaApp
  }.to_app
end

如何使用 spec_helper 注入(inject)测试中间件?

最佳答案

如果您正在使用 Builder(使用、运行等),它看起来您可以在运行时轻松地注入(inject)或删除中间件。这是代码:https://github.com/rack/rack/blob/master/lib/rack/builder.rb

请注意,它构建了中间件堆栈,当您调用 run 时,它会在中间件对象树中实例化堆栈(称为“@use”),每个中间件对象都引用下一个 - 请参阅方法“use”和“to_app”。

所以:不要认为 Builder 的设计目的是允许在堆栈中动态添加和减去中间件。

您可以重建一个新的动态堆栈,或者使用带有或不带有测试中间件的多个 Rack 应用程序,或者像 Rails 那样做一些后空翻来动态地重新配置堆栈。

您还可以仅在测试模式下添加一个测试中间件,或者添加一个可以轻松停用的中间件,使其成为直通中间件。然后你的 spec_helper 将设置并清除变量告诉它通过。

关于ruby - 如何将 Rack 中间件注入(inject)现有的 Rack 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650231/

相关文章:

ruby - 使用 RSpec 将类实例加倍的正确方法?

ruby - 如何在 ActiveAdmin 的显示 View 中隐藏编辑和删除操作?

ruby - Docker Ruby Rack Redis 队列

python - Bottle 中间件捕获某种类型的异常?

Laravel 中间件共享变量 View 在编写 HTTP 测试时不起作用

ruby-on-rails - 如何在rails中获取simple_form的动态id

ruby - 在 Ruby 中重写 Enum#inject 以使用符号作为参数

jquery - Rails 与 JQuery fileupload 给出了预期的数组(得到 Rack::Utils::KeySpaceConstrainedParams

jquery - Sinatra View 在某些删除请求后不会刷新

python - 将元数据添加到 WSGIRequest 对象