Ruby/Cucumber/Capybara 测试多部分文件上传

标签 ruby file-upload cucumber capybara multipart

我正在使用 Cucumber/Capybara 来测试网络应用程序。我几乎是 Ruby 的完全初学者,它向 Cucumber/Capybara 的开发人员提供了真实的证明,证明我仅用我所拥有的极少的 Ruby 知识就能够测试我的应用程序。

但是,正如您可能已经猜到的那样,我已经到了需要专家帮助的地步。我需要测试多部分文件上传。问题是我正在测试的 Web 应用程序有一个 URL 命令接口(interface),但没有关联的页面。所以我不能只加载页面、填写参数并按下按钮。我必须以编程方式格式化 POST 命令。

到目前为止,我一直只使用“访问”与此应用程序进行交互。即我有步骤定义,例如:

Given /^I delete an alert with alertID "([^"]*)" from the site$/ do |alertID|
visit WEB_SITE_ROOT + "/RemoteService?command=deleteAlert&siteName=#{$Site}&alertID=#{alertID}" 
end

但现在我需要做一些帖子。我找到了一些似乎可以满足我需要的代码:

Given /^I upload the "([^"]*)" file "([^"]*)" for the alert$/ do |fileType, fileName|
file = File.new(fileName, "rb")
reply = RestClient.post(
  "#{WEB_SITE_ROOT}" + "/FileUploader?command=upload&siteName=#{$Site}&alertID=#{$OriginalAlertID}",
  :pict       =>  file,
  :function   =>  "#{fileType}",
  :content_type => 'multipart/jpg',
  )
end

但这不是在同一个 cucumber/capybara session 中运行,因此未被授权(之前的步骤之一是登录)。此外,来自 Web 应用程序的回复不会被 Cucumber/capybara 接收,因此我的成功/失败测试不起作用。

有人能给我指出正确的方向吗?

最佳答案

默认情况下, capybara 使用 Rack::Test 适配器,它将绕过 HTTP 服务器并直接与您的 Rack/您的应用程序交互。您在步骤中执行的 POST 请求不会通过 capybara ,因此失败。

要在使用 Rack::Test 时上传文件,您需要使用 Rails #fixture_file_upload方法,默​​认情况下应该在您的 cucumber 步骤中可用。

关于Ruby/Cucumber/Capybara 测试多部分文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360695/

相关文章:

ruby-on-rails - rails 3 : alias_method_chain still used?

java - 使用 Glassfish 中的 RESTful Web 服务上传二进制文件

文件上传到服务器的安全漏洞 - java ee - tomcat

android - 如何编写Calabash Android的步骤定义

ruby - 在数组数组上计算数组乘积

ruby - 如何在不编译或安装的情况下将 ruby​​ 部署到服务器中?

ruby - 如何使用 Ruby 查找一年中的月份

php - 无法在 Hostgator 中上传大于 1Mb 左右的文件

java - 可读和可维护的验收测试框架

cucumber - 如何在 Gherkin 中实现 'if'