鑑於機架的應用程序,是不是Rails的,如何將Rack中間件注入現有的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中間件注入現有的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」),每個中間件對象都有對下一個對象的引用 - 請參閱「使用」和「to_app」方法。
所以:不要認爲Builder設計允許動態地添加和減少堆棧中的中間件。
您可以重新構建一個新的動態堆棧,或者在有和沒有測試中間件的情況下使用多個Rack應用程序,或者像Rails那樣做一些後向移動來動態重新配置堆棧。
您還可以僅在測試模式下添加測試中間件,或者可以輕鬆禁用測試中間件,以便它成爲傳遞中間件。然後你的spec_helper會設置並清除告訴它通過的變量。
因爲我想前插到中間件堆棧,解決這一特定使用案例很容易。
鑑於如上定義一個名爲 「應用程序」 一個應用程序,添加新的中間件:use ...
def new_app
Rack::Builder.new do
use ...
use ...
run app
end.to_app
end
好的,謝謝。我以爲你可以在Rails中做到這一點,或許可以在Rack中做到這一點。我目前正在爲測試使用單獨的機架構建,但這會造成重複。我認爲這比用測試代碼污染生產版更好。 –
用於測試的獨立機架生成器可能與您在此獲得的解決方案一樣乾淨。 –
Rails保留了一個不同的非生成器堆棧。如果你需要其他的東西,太棒了。但是如果你需要爲了這個問題而構建/複製,那麼對於結果來說代碼和複雜性就太多了。 –