2013-10-03 6 views
12

Для теста rspec мне нужно загрузить отчет в формате CSV-файла и проверить предоставленную информацию.Загрузка CSV с использованием Capybara

Отчет создается с веб-страницы при нажатии кнопки. Открывается диалоговое окно сохранения браузеров, позволяющее открывать или сохранять параметры.

Как я могу получить файл для сохранения на компьютере с помощью rspec и Capybara?

+0

Звучит неправильно. Почему бы не проверить, отправляет ли контроллер ваш файл correnct (тип MIME, код ответа) и генерирует ли модель правильные данные (контент)? В спецификации интеграции я бы только тестировал, существует ли кнопка и что клик не будет взорвать ваше приложение. – DMKE

+0

Извините, что не ясна. Все, что мне нужно, это получение правильного файла и проверка данных. Я просто не знаю, как получить файл с сайта с помощью Capybara. – user1496754

+1

Точно моя точка. Вы можете просто получить файл с спецификацией контроллера; для этого вам не нужен тест интеграции/функции: в спецификации контроллера после 'get: show, id: 42, format:: csv',' response.body' будет содержать содержимое CSV. – DMKE

ответ

1

Если вы являетесь «подтверждением» предоставленной информации », то вы используете второй ответ DMKE. Возможно, вам потребуется отправить сообщение в форму для входа, чтобы сначала получить файл cookie сеанса, а затем использовать пост, а не получить форму, которая приведет к загрузке файла.

Если в результате использует javascript и iframe для загрузки файла, затем проанализируйте возвращенный html, извлеките фактический url для загрузки информации и загрузки данных из этого.

Мое личное предпочтение состоит в том, чтобы проверить мой код на копию файла, проверенную на контроль исходного кода, поэтому тесты моего собственного кода не зависят от того, какой иностранный сайт находится вверху и доступен. Я кодирую класс rake task/helper, чтобы получить свежую копию данных по мере необходимости, и иметь несколько простых тестов для проверки. Я могу декодировать файл данных во что-то, что имеет смысл.

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

6

Если у вас есть действие контроллера, который выглядит примерно так:

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

MyModel.all.each do |record| 
    page.should have_content record.field1 
    page.should have_content record.field2 
end 
+0

Это действительно конкретный драйвер. PhantomJS этого не делает. –

8

я использую MiniTest::Spec для этого и сделал это с WebKit-драйвер, но он должен перевести RSpec без проблем, как это в основном просто Капибара функциональность:

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 

Я не стал вдаваться в подробности о формате данных, но записи, которые должны были там были там и те, которые не должны были быть забыты (конечно, это был всего лишь небольшой набор данных для быстрого тестирования тестов).

Смежные вопросы