Загрузка CSV с использованием Capybara
Для теста rspec мне нужно загрузить отчет в формате CSV файла и проверить предоставленную информацию.
Отчет создается с веб-страницы при нажатии кнопки. Открывается диалоговое окно сохранения браузеров, открывающее или сохраняющее параметры.
Как я могу получить файл для сохранения на компьютере с помощью rspec и Capybara?
Ответы
Ответ 1
Я использовал 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
Я не вдавался в подробности о формате данных, но записи, которые должны были быть там, были и те, которые не должны были быть опущены (конечно, это был всего лишь небольшой набор данных, чтобы держать тесты быстрыми).
Ответ 2
Предполагая, что у вас есть действие контроллера, которое выглядит примерно так:
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
Я смог использовать Capybara для проверки того, что нажатие на мою кнопку заставит браузер вызвать приглашение для загрузки:
click_on 'Download as CSV'
header = page.response_headers['Content-Disposition']
header.should match /^attachment/
header.should match /filename="my_file.csv"$/
Обратите внимание, что 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
Ответ 3
Если вы "проверяете" информацию, указанную ", то вы используете второй ответ DMKE. Вам может потребоваться опубликовать форму входа в систему, чтобы сначала получить файл cookie сеанса, а затем использовать пост, а не получить форму, которая приведет к загрузке файла.
Если результат использует javascript и iframe для загрузки файла, затем проанализируйте возвращенный html, извлеките фактический URL-адрес для загрузки информации и загрузите данные из этого.
Мое личное предпочтение заключается в проверке моего кода на копию файла, проверенного на управление исходным кодом, поэтому тесты моего собственного кода не зависят от того, какой иностранный сайт находится вверху и доступен. Я кодирую класс rake task/helper для получения свежей копии данных по мере необходимости и проведу несколько простых тестов для проверки. Я могу декодировать файл данных во что-то, что имеет смысл.
Если вы проверяете, как именно данные декодируются, вам понадобится фиксированный входной файл. Если вы просто подтверждаете, что это "выглядит разумно", вы можете