ruby - 如何在 Rack 应用程序的集成测试中启用中间件?

标签 ruby rspec rack rack-middleware

在为 Rack 应用程序编写集成测试时,我想使用经典的 config.ru 文件在运行时环境中启用的所有中间件来测试该应用程序。

使用 rack-app ,我可以用以下方法实例化 Rack 应用程序:

describe App do

  include Rack::App::Test
  rack_app described_class

  describe '/hello' do
    get '/example/endpoint/'
    # ...
  end
end

使用裸rack,它看起来是一样的:

include Rack::Test::Methods
let(:app) { Application }

但是没有启用的中间件,因为应用程序不是通过 config.ru 实例化的,其中 use 命令启用它们。

如何在测试中启用中间件,以便在示例中请求通过它们运行?

最佳答案

中间件中的逻辑是 rack-app 类的必备要求吗?

如果是,那么它应该直接在 rack-app 类中使用,并且它应该像您通常所做的那样是一个简单的规范。您使用 rack_app ClassNameHere 定义 rack-app 主题并进行测试。这种方法的优点是您不必从规范的角度知道一些逻辑在中间件中,一些位于 Controller 部分,因为它们是实现细节。只要在规范测试用例中实现了预期的行为,就应该是好的。

但如果答案是否定的,那么它应该独立测试,并且通常应该有一个地方完成所有的集成。我通常在顶级 Rack 应用程序中组合子 Rack 应用程序和中间件,我只使用 use 和 mount 关键字并创建集成测试以确保路由并确认中间件的预期行为。

中间件中的逻辑是否是应用程序的一种契约形式,例如中间件确保 Rack 调用环境中的值,但该值未与中间件耦合,那么我将自行测试中间件。在 rack-app 类规范中,我会保证 rack 调用环境中的实体。这将支持项目的长期维护方面,并使 rack-app 类易于重用。

另一方面,如果你真的需要一起测试而不是直接使用类中的中间件,那么你可以在规范中使用以下习惯用法:

rack_app do
  use MiddlewareNameHere, params
  mount AppToTestWithTheMiddleware
end

干杯, 亚当

关于ruby - 如何在 Rack 应用程序的集成测试中启用中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60976324/

相关文章:

javascript - cookie 的 Rails 编码与 JavaScript decodeURIComponent 不兼容

rubygems - 无法激活 sinatra-1.4.7,因为 rack-2.0.1 与 rack (~> 1.5) 冲突

java - 同时使用 java 和 Ruby on Rails...可能吗?

ruby-on-rails - 在 Rspec 中定义类

ruby - Rspec: "array.should == another_array"但不关心顺序

ruby-on-rails-3 - 使用 rails/rspec/capybara/devise 测试 "Account Confirmation"

Ruby 中的 JavaScript

ruby-on-rails - 无法在 Rails 3.2.14、Ruby 2.1.0 的事件记录中添加键、值对

javascript - Rails javascript 按钮导致发布

ruby-on-rails-3 - 在 Rails 中重命名 session cookie