gpt4 book ai didi

ruby - 在没有服务器的情况下测试 Ruby Rack 时如何假装上传文件?

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:56 29 4
gpt4 key购买 nike

为了测试,我直接向应用程序发送一个 Rack::Request,而不是使用服务器。

def request_via_API( app, method, path, params={} ) # app should be API
env = Rack::MockRequest.env_for( path, {:method => method, :params=>params} )
app.handle Rack::Request.new(env)
end

非常适合测试直接输入,但我受阻于文件上传。我的真实系统在浏览器中通过文件上传运行良好。但现在我想通过 API 对其进行测试,并且不知道如何通过任何 Rack 类/方法将文件内容放入请求中。 (我尝试理解 Rack::Test::UploadedFile 但没有成功)。

谢谢,阿利斯泰尔

最佳答案

您绝对是在正确的道路上。您甚至可以在不进行任何修改的情况下使用您的函数 request_via_API,例如:

request_via_API(app, 'POST', '/', {
:field => "value",
:text_source => Rack::Multipart::UploadedFile.new(PATH_TO_YOUR_FILE, MIME_TYPE_OF_YOUR_FILE)
})

这意味着您需要在某处放置一些文件。如果您使用固定装置,您的测试上传文件应该在它们周围。您可以省略 MIME 时间,但它默认为 text/plain

如果你使用准系统 Rack,你会在调用 Rack::Multipart.parse_multipart 后得到以下哈希值:

{
"field" => "value",
"text_source" => {
:filename => File.basename(PATH_TO_YOUR_FILE),
:type => MIME_TYPE_OF_YOUR_FILE,
:name => "text_source",
:tempfile => Tempfile.new("RackMultipart"), # copied from PATH_TO_YOUR_FILE
:head => "Content-Disposition: form-data; name=\"text_source\"; filename=\"#{File.basename(PATH_TO_YOUR_FILE)}\"\r\n" +
"Content-Type: #{MIME_TYPE_OF_YOUR_FILE}\r\n" +
"Content-Length: #{BYTESIZE_OF_YOUR_FILE}\r\n"
}
}

当然,text_source 键可以有任何其他名称。

Rack::MockRequest#env_for在以下情况下自动尝试创建多部分表单数据请求:

  • HTTP 方法不是 GET
  • 没有提供:input选项
  • :params 选项是一个Hash
  • :params 选项值至少包含一个 Rack::Multipart::UploadedFile 实例

详情可以看源码herehere .

我认为依赖 Rack::MockRequestRack::Multipart 生成的多部分请求仅对模拟具有文件上传和文件上传机制的 HTML 表单有用相同。因此,无需直接使用 Rack::Multipart#build_multipartRack::Multipart::Generator

如果你有更复杂的多部分场景或不同的文件上传机制,你必须通过 :input 键而不是 :params 传递 opts 参数至 Rack::MockRequest#env_for .就 Rack 模拟功能而言,如何为 :input 生成该值是您的问题。它只将它包装在 StringIO 中如果它是 String,如您所见 here .否则,它与 Rack 环境散列中作为 rack.input 传递的内容相同,因此它必须符合 Rack input stream spec。 (即,成为类似 IO 的对象)。

因为这对我来说也是一个很大的挑战,我用它作为一个练习来加深我对 Rack 的了解,所以我创建了一个 simple project on GitHub探索这个文件上传模拟。

注意:除了指向 Rack SPEC 的链接(所以要小心),我尝试将所有内容修复到 Rack 1.5.2。指向 Ruby StdLib 的链接指向当前版本。

关于ruby - 在没有服务器的情况下测试 Ruby Rack 时如何假装上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475912/

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