如何将Rack中间件注入现有的Rack应用程序?

时间:2015-04-15 12:28:39

标签: ruby rack middleware rack-middleware

鉴于Rack应用程序不是Rails,

builder.rb:

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

    run ThaApp
  }.to_app
end

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

由于我想 prepend 到中间件堆栈,因此很容易解决这个特定用例。

鉴于上面定义了一个名为" app"的应用,添加新的中间件:use ...

def new_app
  Rack::Builder.new do
    use ...
    use ...

    run app
  end.to_app
end
相关问题