You wystarczy najprostsza na świecie aplikacja Rack:
let(:app) { lambda {|env| [200, {'Content-Type' => 'text/plain'}, ['OK']]} }
Ponadto Twój konstruktor oprogramowania pośredniego powinien otrzymać aplikację jako pierwszą ter nie hash tak powinien brzmieć:
subject { MyMiddleWare.new(app) }
według wszelkiego prawdopodobieństwa, choć nasz test będzie musiał ustalić, jaki wpływ wywarło na middleware wniosku. Możesz więc napisać nieco bardziej wyrafinowaną aplikację do obsługi stojaków, aby śledzić oprogramowanie pośredniczące.
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
, a następnie prawdopodobnie będziesz chciał użyć Rack :: MockRequest do wysłania żądania. Coś w rodzaju:
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
Nie ma tutaj tematu, jak to działa? – Calin
To w rzeczywistości nie jest prawidłową aplikacją Rack. "Lambda" musiałaby przyjąć argument, by być prawidłową aplikacją Rack. – branch14
Zaktualizowano, aby opublikować post - dzięki, @Calin. – Ritchie