1

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

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

在 RSpec 和 Sinatra 工作。

4

2 回答 2

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
于 2013-06-28T00:48:24.390 回答
2

@Denis 的回答会起作用,但我个人更喜欢另一种选择,即将中间件放在一个裸 Rack 应用程序中(无论是 Sinatra 还是其他),然后将请求作为响应传递并对其进行测试。这是大多数 Rack 中间件的规格。那,以及对中间件内部进行单元测试。

例如,这就是我在这里使用 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
于 2013-06-28T12:46:53.877 回答