Загрузка 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 для получения свежей копии данных по мере необходимости и проведу несколько простых тестов для проверки. Я могу декодировать файл данных во что-то, что имеет смысл.

Если вы проверяете, как именно данные декодируются, вам понадобится фиксированный входной файл. Если вы просто подтверждаете, что это "выглядит разумно", вы можете