在 Sinatra 中用二进制数据模拟 post 请求
Mocking a post request with binary data in Sinatra
我的 Sinatra 应用程序中有一个端点,它将接收二进制数据作为正文的一部分。发送数据的其他应用程序将有一个法拉第请求,如下所示:
connection = Faraday.new(url: "https://example.com/post_data") do |conn|
conn.request :multipart
conn.adapter :net_http
conn.headers['Content-Type'] = 'octet/stream'
end
@response ||= connection.post do |req|
req.params = { :host => host,
:verification => "false"}
req.body = my_base64_encoded_binary
end
然后,在 Sinatra 中,我将有一个端点接收这些请求参数和二进制数据并将其传递给模型,如下所示:
post '/post_data' do
request.body.rewind
payload = request.body.read
raise Sinatra::NotFound unless payload and params[:host]
output = MyOutput.new(params, payload)
content_type 'application/json'
body output.data
end
当我尝试使用 Rack::Test
助手测试此端点时,我遇到了一个奇怪的情况。我似乎无法创建适当的模拟来正确测试此端点。基于使用 PostMan 进行的一些手动测试,我非常确定我的端点可以正常工作。只是考试阻碍了我。这是规范:
it "should return a json response" do
post(url, :host => host, :verification => "false") do |req|
req.body = [my_binary]
req.content_type = "application/octet-stream"
end
expect(last_response.status).to eq(200)
expect(last_response.content_type).to eq("application/json")
end
当我检查传入请求在测试中的样子时,它不包含正确的正文。 params
已正确设置为我设置的 host
和 verification
设置,但正文也被设置为参数(通过 payload = request.body.read
检查)而不是二进制文件。
是否有不同的方法来设置模拟,以便将二进制文件正确设置为请求的主体,并且参数仍正确设置为请求参数?
答案是 post 正文的唯一方法是我在机架测试助手中添加参数的地方。我需要获取 params
并将它们移动到请求中 URL 的查询字符串中,然后仅将二进制文件添加为 post
请求的 body
测试助手。
let(:url) { "http://example.com/post_data?host=>#{host}&verification=#{verification}" }
it "should return a json response" do
post(url, my_binary)
expect(last_response.status).to eq(200)
expect(last_response.content_type).to eq("application/json")
end
我的 Sinatra 应用程序中有一个端点,它将接收二进制数据作为正文的一部分。发送数据的其他应用程序将有一个法拉第请求,如下所示:
connection = Faraday.new(url: "https://example.com/post_data") do |conn|
conn.request :multipart
conn.adapter :net_http
conn.headers['Content-Type'] = 'octet/stream'
end
@response ||= connection.post do |req|
req.params = { :host => host,
:verification => "false"}
req.body = my_base64_encoded_binary
end
然后,在 Sinatra 中,我将有一个端点接收这些请求参数和二进制数据并将其传递给模型,如下所示:
post '/post_data' do
request.body.rewind
payload = request.body.read
raise Sinatra::NotFound unless payload and params[:host]
output = MyOutput.new(params, payload)
content_type 'application/json'
body output.data
end
当我尝试使用 Rack::Test
助手测试此端点时,我遇到了一个奇怪的情况。我似乎无法创建适当的模拟来正确测试此端点。基于使用 PostMan 进行的一些手动测试,我非常确定我的端点可以正常工作。只是考试阻碍了我。这是规范:
it "should return a json response" do
post(url, :host => host, :verification => "false") do |req|
req.body = [my_binary]
req.content_type = "application/octet-stream"
end
expect(last_response.status).to eq(200)
expect(last_response.content_type).to eq("application/json")
end
当我检查传入请求在测试中的样子时,它不包含正确的正文。 params
已正确设置为我设置的 host
和 verification
设置,但正文也被设置为参数(通过 payload = request.body.read
检查)而不是二进制文件。
是否有不同的方法来设置模拟,以便将二进制文件正确设置为请求的主体,并且参数仍正确设置为请求参数?
答案是 post 正文的唯一方法是我在机架测试助手中添加参数的地方。我需要获取 params
并将它们移动到请求中 URL 的查询字符串中,然后仅将二进制文件添加为 post
请求的 body
测试助手。
let(:url) { "http://example.com/post_data?host=>#{host}&verification=#{verification}" }
it "should return a json response" do
post(url, my_binary)
expect(last_response.status).to eq(200)
expect(last_response.content_type).to eq("application/json")
end