gpt4 book ai didi

ruby-on-rails - 使用 Rspec 测试中间件

转载 作者:行者123 更新时间:2023-12-03 12:44:39 27 4
gpt4 key购买 nike

我已经写了一些 Rack 中间件,现在我正在尝试使用 Rspec 对其进行测试。但是所有的 Rack-Middleware 都是用一个 'app' 参数实例化的,它代表 Rails 应用程序本身。你们如何在 Rspec 中模拟这个?

例如,

 describe MyMiddleWare do
let(:app) { # How do I mock a Rails app object here? }
subject { MyMiddleWare.new(app: app) }

it 'should blah blah blah' do
# a bunch of tests go here
end
end

最佳答案

您只需要世界上最简单的 Rack 应用程序:

let(:app) { lambda {|env| [200, {'Content-Type' => 'text/plain'}, ['OK']]} }

此外,你的中间件的构造函数应该接收一个应用程序作为它的第一个参数而不是一个哈希值,所以它应该是:
subject { MyMiddleWare.new(app) }

不过,您的测试很可能需要确定中间件对请求产生了什么影响。因此,您可能会编写一个稍微复杂的 Rack 应用程序来监视您的中间件。
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

关于ruby-on-rails - 使用 Rspec 测试中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17506567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com