- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
为了测试,我直接向应用程序发送一个 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
在以下情况下自动尝试创建多部分表单数据请求:
:input
选项:params
选项是一个Hash
:params
选项值至少包含一个 Rack::Multipart::UploadedFile
实例我认为依赖 Rack::MockRequest
和 Rack::Multipart
生成的多部分请求仅对模拟具有文件上传和文件上传机制的 HTML 表单有用相同。因此,无需直接使用 Rack::Multipart#build_multipart
或 Rack::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/
在 .NET 中,字符串是不可变的并且是引用类型变量。这通常会让新的 .NET 开发人员感到惊讶,因为他们的行为可能会将它们误认为是值类型对象。但是,除了使用 StringBuilder 的做法之外用
我一直在寻找 problem of type-erasing a std::packaged_task using std::function 的解决方法. 我想做的是这样的: #include #
如何让机器人假装它正在输入消息? 当机器人假装输入时,聊天中会出现以下文本: 我使用 python aiogram框架,但对 native Telegram API 的建议也会有所帮助。 最佳答案 我
我找到了使用 Feign 上传文件的解决方案,但我的配置产生了另一个问题。我有几个 Feign 客户端,用于从客户端服务使用不同的服务。 现在,当我提交一个简单的表单时,我收到此错误: feign.c
我的网站中包含一个脚本,它读取 url 上的一个变量,例如 www.test.com/?mboxDisable=1 所以我想知道如何在 www.test.com 上伪造它,js 会在那里“思考”是 m
我目前正在使用 Spring Cloud 和 Feign 在我的应用程序中使用微服务。因为它可能发生,数据库连接等在单个服务实例中失败,使其返回 500 HTTP 状态代码,我想确保服务的客户端重试下
当我尝试废弃 this site使用 Phantomjs,默认情况下,Phantomjs 将以下 header 发送到服务器: "name":"User-Agent", "value":"Mozill
我的服务使用了 3 个假客户端。每次启动应用程序时,我都会在第一次调用任何假客户端时收到 TimeoutException。 在一切稳定之前,我必须至少触发每个假客户端一次。在网上查了一下,问题是 f
我想得到一个 Spring Cloud Netflix Feign客户端通过 HTTP 获取一些 JSON 并将其转换为对象。我不断收到此错误: org.springframework.web.cli
我是一名优秀的程序员,十分优秀!