如何在机架应用程序的集成测试中启用中间件



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

使用机架应用程序,我可以实例化机架应用程序:

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应用程序类中使用,并且它应该是一个简单的规范,就像你通常做的那样。您使用rack_app ClassName在此处定义rack应用程序主题并进行测试。这种方法的Pro是,你不必从规范的角度知道,有些逻辑在中间件中,有些位于控制器部分,因为它们是实现细节。只要在规范测试用例中实现了预期的行为,就应该是好的。

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

中间件中的逻辑是应用程序的一种契约形式,就像中间件在机架调用env中确保了一个值,但这个值没有与中间件耦合,那么我会自己测试中间件。在机架应用程序类规范中,我保证机架调用env中的实体。这将支持项目的长期维护,也使机架应用程序类易于重复使用。

另一方面,如果您确实需要一起测试,但不直接在类中使用中间件,那么您可以在规范中使用以下习惯用法:

rack_app do
use MiddlewareNameHere, params
mount AppToTestWithTheMiddleware
end

干杯,Adam

最新更新