2

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

builder.rb:

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

    run ThaApp
  }.to_app
end

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

4

2 回答 2

1

如果您使用的是 Builder(使用、运行等),那么您似乎无法在运行时轻松地注入或删除中间件。这是代码:https ://github.com/rack/rack/blob/master/lib/rack/builder.rb

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

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

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

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

于 2015-04-15T15:32:48.927 回答
0

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

给定一个如上定义的名为“app”的应用,添加新的中间件:use ...

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

    run app
  end.to_app
end
于 2015-05-04T17:07:19.510 回答