You просто нужно простейшее в мире приложение для монтажа в стойку:
let(:app) { lambda {|env| [200, {'Content-Type' => 'text/plain'}, ['OK']]} }
Кроме того, конструктор вашего Middleware должен получить приложение в качестве первого параме тер не хэш, так что следует читать:
subject { MyMiddleWare.new(app) }
По всей вероятности, хотя, ваше испытание будет необходимо, чтобы определить, какое влияние промежуточного слоя был по запросу. Таким образом, вы можете написать немного более сложное приложение стойки, чтобы шпионить за вашим промежуточным программным обеспечением.
class MockRackApp
attr_reader :request_body
def initialize
@request_headers = {}
end
def call(env)
@env = env
@request_body = env['rack.input'].read
[200, {'Content-Type' => 'text/plain'}, ['OK']]
end
def [](key)
@env[key]
end
end
, а затем вы, вероятно, захотите использовать Rack :: MockRequest для отправки запроса. Что-то вроде:
describe MyMiddleWare do
let(:app) { MockRackApp.new }
subject { described_class.new(app) }
context "when called with a POST request" do
let(:request) { Rack::MockRequest.new(subject) }
before(:each) do
request.post("/some/path", input: post_data, 'CONTENT_TYPE' => 'text/plain')
end
context "with some particular data" do
let(:post_data) { "String or IO post data" }
it "passes the request through unchanged" do
expect(app['CONTENT_TYPE']).to eq('text/plain')
expect(app['CONTENT_LENGTH'].to_i).to eq(post_data.length)
expect(app.request_body).to eq(post_data)
end
end
end
end
Здесь нет ни одного вопроса, как это работает? – Calin
Это действительно недействительное приложение Rack. 'Lambda' должен был бы принять аргумент как действительное приложение Rack. – branch14
Обновлено для публикации на тему - спасибо, @Calin. – Ritchie