Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在Sinatra中禁用中间件?_Ruby_Sinatra_Rack_Rack Middleware - Fatal编程技术网

Ruby 如何在Sinatra中禁用中间件?

Ruby 如何在Sinatra中禁用中间件?,ruby,sinatra,rack,rack-middleware,Ruby,Sinatra,Rack,Rack Middleware,我正在使用Sinatra制作一个安全的web服务。它需要SSL和随每个请求一起发送的安全令牌。因此,我制作了一个简单的中间件,用于检查每个传入的请求是否有安全令牌,并在请求丢失或无效时拒绝该请求 module MyWebService class App < Sinatra::Base use MyWebService::Security # ... end end 模块MyWebService 类应用程序

我正在使用Sinatra制作一个安全的web服务。它需要SSL和随每个请求一起发送的安全令牌。因此,我制作了一个简单的中间件,用于检查每个传入的请求是否有安全令牌,并在请求丢失或无效时拒绝该请求

module MyWebService
  class App < Sinatra::Base
    use MyWebService::Security

    # ...
  end
end
模块MyWebService
类应用程序
然而,这显然使我的大型验证测试套件失败,因为它们是在我向web服务添加安全性之前编写的


是否有任何方法可以在中间件启用后简单地禁用它?这样,我的整个测试套件仍能正常工作,我可以单独测试安全中间件。

我找到了一个可使用但不美观的解决方法

我没有在应用程序中启用中间件,而是在
config.ru
中启用它。因此:

module MyWebService
  class App < Sinatra::Base
    use MyWebService::Security   # Remove this line
  end
end
现在,我的所有验证测试都通过了,并且在启动服务器时启用了安全中间件

为了测试安全中间件,我将我的应用子类化,并在子类中启用安全中间件:

class SecurityMiddlewareValidation < Minitest::Test
  include Rack::Test::Methods

  def app
    Class.new(MyWebService::App) { use MyWebService::Security }
  end

  # ...
end
类安全iddlewarevalidation

这样我就不需要在测试之间禁用/启用中间件。

类似的方法是有条件地添加中间件,类似于
使用MyWebService::Security,除非$testing
。这将使您可以控制在堆栈中添加中间件的位置,而代价是必须在各种测试中处理标记。@matt Yep,但如果没有禁用中间件的方法,它将被启用或永久禁用。这可能是测试时的一个问题。例如,我的大多数测试必须在禁用安全性的情况下运行,但安全性测试必须在启用安全性的情况下运行。坦率地说,我认为这是一个完美的解决方案。中间件是通过
config.ru
添加的。
class SecurityMiddlewareValidation < Minitest::Test
  include Rack::Test::Methods

  def app
    Class.new(MyWebService::App) { use MyWebService::Security }
  end

  # ...
end