14

对于 rspec 测试,我需要下载 CSV 文件格式的报告并验证给出的信息。

单击按钮时会从网页生成报告。浏览器保存对话框打开,提供打开或保存选项。

如何使用 rspec 和 Capybara 将文件保存到计算机?

4

3 回答 3

13

我一直在使用MiniTest::Spec它并使用 webkit-driver 完成它,但它应该毫无问题地转换为 RSpec,因为它基本上只是 Capybara 功能:

scenario "download overview" do
  within "aside#actions" do
    click_link "Download overview"
  end
  page.status_code.must_equal 200
  page.response_headers['Content-Type'].must_equal "text/csv"
  page.response_headers['Content-Disposition'].must_match /attachment; filename="Übersicht.*\.csv/
  page.must_have_content "Schubidu"
  page.must_have_content "U13"
  page.wont_have_content "5000"
end

我没有详细介绍数据的格式,但是应该存在的记录和不应该被遗漏的记录都在那里(当然这只是一个小数据集,以保持测试的快速性)。

于 2014-02-07T09:31:14.853 回答
6

Assuming you have a controller action that looks something like this:

require 'csv' # assuming you have this line somewhere

  def download
    @records = MyModel.all
    csv_data = CSV.generate do |data|
      data << ["Field 1", "Field 2"]
      @records.each do |record|
        data << [record.field1, record.field2]
      end
    end
    send_data csv_data, type: "text/csv", filename: "my_file.csv"
  end

I was able to use Capybara to verify that clicking my button would have caused the browser to trigger a download prompt:

click_on 'Download as CSV'
header = page.response_headers['Content-Disposition']
header.should match /^attachment/
header.should match /filename="my_file.csv"$/

Note that page.response_headers is driver specific. I'm using capybara-webkit. A Content-Disposition header should contain attachment rather than inline for it to cause a download prompt. Capybara also displayed the content of the file as the response body (although this may also be driver specific), so it was easy to verify the output:

MyModel.all.each do |record|
  page.should have_content record.field1
  page.should have_content record.field2
end
于 2014-02-05T20:23:33.810 回答
2

如果您正在“验证(验证)给定的信息”,那么您使用 DMKE 的第二个答案。您可能需要先发布到登录表单以获取会话 cookie,然后使用 post 而不是 get 获取将导致文件被下载的表单。

如果结果使用 javascript 和 iframe 下载文件,则解析返回的 html,提取实际 url 以下载信息并从中下载数据。

我个人的偏好是针对签入源代码控制的文件副本测试我的代码,因此我自己的代码的测试不依赖于外部站点的启动和可用。我编写了一个 rake 任务/帮助程序类来适当地获取数据的新副本,并进行一些简单的测试来验证我可以将数据文件解码为有意义的东西。

如果您的测试正在验证数据是如何被解码的,那么您将需要一个固定的输入文件。如果您只是验证它“看起来合理”,那么您可以

于 2014-02-05T08:15:24.873 回答