如何测试Rack中间件的请求(而不是响应)?

时间:2013-06-28 00:30:42

标签: ruby rspec sinatra rack middleware

我可以看看如何测试机架中间件的响应,但是如何测试 请求

那就是,如何测试中间件何时更改 应用程序的请求?

在RSpec和Sinatra工作。

2 个答案:

答案 0 :(得分:2)

我认为你的意思是测试它是否在改变环境......

中间件类似于:

class Foo
  def initialize(app)
    @app = app
  end

  def call(env)
    # do stuff with env ...
    status, headers, response = @app.call(env)

    # do stuff with status, headers and response
    [status, headers, response]
  end
end

您可以使用伪造的应用程序(或lambda,就此而言)初始化它,在执行某些测试后返回虚拟响应:

class FooTester
  attr_accessor :env

  def call(env)
    # check that env == @env and whatever else you need here
    [200, {}, '']
  end
end

答案 1 :(得分:2)

@Denis的答案可行,但我个人更喜欢另一种选择,即将中间件放在裸机架应用程序中(无论是Sinatra还是其他),只需将请求作为响应传递并测试即可。这是大多数Rack中间件的推出方式。那,并且单元测试中间件的内部。

例如,这就是我done here with a fork of Rack Clicky


编辑:分别从主应用程序测试中间件。

require 'lib/rack/mymiddelware.rb'
require 'sinatra/base'

describe "My Middleware" do
  let(:app) {
    Sinatra.new do
      use MyMiddleware
      get('/') { request.env.inspect }
    end
  }
  let(:expected) { "Something you expect" }
  before do
    get "/"
  end
  subject { last_response.body }
  it { should == expected }
end