3

在为 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

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

4

1 回答 1

1

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

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

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

是不是中间件中的逻辑是对应用程序的一种契约形式,就像中间件在rack call env中保证了一个值,但是这个值没有和中间件耦合,那我就自己去测试中间件。在 rack-app 类规范中,我会保证 rack 调用 env 中的实体。这将支持项目的长期维护方面,也使 rack-app 类易于重用。

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

rack_app do
  use MiddlewareNameHere, params
  mount AppToTestWithTheMiddleware
end

干杯,亚当

于 2020-04-14T22:45:12.840 回答