我正在做这个:
require 'rack/test'
data = # some binary data, for example, ZIP archive
put('/foo', data, 'content_type' => 'application/octet-stream')
工作得很好,直到我将
%
符号放入 data
中。在这种情况下,我得到这个:
Invalid query parameters: invalid %-encoding ... (long exception text)
我不想对我的
data
进行Base64编码或CGI编码,因为服务器端代码无需测试就可以正常工作。问题是我使用 Rack 的方式。我必须以某种方式通知它不要触摸我的数据并将其“按原样”发送给 Sinatra。怎么办?
此代码重现了问题(只需按原样运行,您就会看到打印的内容):
require 'sinatra'
require 'minitest/autorun'
require 'rack/test'
put '/foo' do
'OK'
end
class FooTest < Minitest::Test
include Rack::Test::Methods
def app
Sinatra::Application
end
def test_me
put('/foo', 'hello % world')
assert_equal(200, last_response.status, last_response.body)
end
end
我明白了:
1) Failure:
FooTest#test_me [a.rb:18]:
Invalid query parameters: invalid %-encoding (hello % world).
Expected: 200
Actual: 400
但是,如果我删除
%
符号,测试就会通过。
您可以通过指定 Content-Type 标头来让测试通过:
def test_me
put('/foo', 'hello % world', 'CONTENT_TYPE' => 'application/octet-stream')
assert_equal(200, last_response.status, last_response.body)
end
但是,与您的第一个示例不同,该键必须是 大写,如 Rack::Test 示例 中所示。