use*_*754 13 ruby rspec capybara
对于rspec测试,我需要以CSV文件格式下载报告并验证给出的信息.
单击按钮时,将从网页生成报告.浏览器保存对话框已打开,提供打开或保存选项.
如何使用rspec和Capybara将文件保存到计算机中?
Pat*_*tru 11
我一直在使用MiniTest::Spec它并使用webkit驱动程序,但它应该转换为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
Run Code Online (Sandbox Code Playgroud)
我没有详细介绍数据的格式,但应该存在的记录和那些不应该被遗漏的记录(当然这只是一个小数据集来保持测试的快速).
假设你有一个看起来像这样的控制器动作:
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
Run Code Online (Sandbox Code Playgroud)
我能够使用Capybara来验证单击我的按钮会导致浏览器触发下载提示:
click_on 'Download as CSV'
header = page.response_headers['Content-Disposition']
header.should match /^attachment/
header.should match /filename="my_file.csv"$/
Run Code Online (Sandbox Code Playgroud)
请注意,这page.response_headers是特定于驱动程 我正在使用capybara-webkit.一个Content-Disposition头应该包含attachment,而不是inline它引起下载提示.Capybara还将文件的内容显示为响应主体(尽管这也可能是特定于驱动程序的),因此很容易验证输出:
MyModel.all.each do |record|
page.should have_content record.field1
page.should have_content record.field2
end
Run Code Online (Sandbox Code Playgroud)
如果您要“验证所提供的信息”,那么您将使用 DMKE 的第二个答案。您可能需要首先发布到登录表单以获取会话 cookie,并使用 post 而不是 get 来获取将导致下载文件的表单。
如果结果使用 javascript 和 iframe 下载文件,则解析返回的 html,提取实际的 url 来下载信息并从中下载数据。
我个人的偏好是根据签入源代码控制的文件副本来测试我的代码,因此我自己的代码的测试不依赖于外部站点的启动和可用。我编写了一个 rake 任务/帮助程序类,以根据需要获取数据的新副本,并进行一些简单的测试来验证我可以将数据文件解码为有意义的内容。
如果您的测试正在验证数据的解码方式,那么您将需要一个固定的输入文件。如果您只是验证它“看起来合理”那么您可以