给定一个不是 Rails 的 Rack 应用程序,
builder.rb:
def app
Rack::Builder.new{
use Rack::Static, urls:static_paths, root:'public'
run ThaApp
}.to_app
end
如何使用 spec_helper 注入测试中间件?
给定一个不是 Rails 的 Rack 应用程序,
builder.rb:
def app
Rack::Builder.new{
use Rack::Static, urls:static_paths, root:'public'
run ThaApp
}.to_app
end
如何使用 spec_helper 注入测试中间件?
如果您使用的是 Builder(使用、运行等),那么您似乎无法在运行时轻松地注入或删除中间件。这是代码:https ://github.com/rack/rack/blob/master/lib/rack/builder.rb
请注意,它构建了中间件堆栈,并且当您调用 run 时,它会在中间件对象树中实例化堆栈(称为“@use”),每个中间件对象都引用下一个对象 - 请参阅方法“use”和“to_app” .
所以:不要认为 Builder 旨在允许在堆栈中动态添加和减去中间件。
你可以重建一个新的动态堆栈,或者使用多个 Rack 应用程序,无论是否测试中间件,或者像 Rails 那样做一些后空翻来动态重新配置堆栈。
您还可以仅在测试模式下添加测试中间件,或者可以轻松停用的中间件,使其成为传递中间件。然后,您的 spec_helper 将设置并清除告诉它通过的变量。
由于我想预先添加到中间件堆栈,因此解决这个特定用例很容易。
给定一个如上定义的名为“app”的应用,添加新的中间件:use ...
def new_app
Rack::Builder.new do
use ...
use ...
run app
end.to_app
end