В приложении, использующем RSpec 3+, вы не захотите делать HTTP-запрос POST с Capybara. Capybara для эмуляции поведения пользователя и принятия поведения JS и содержимого страницы, которое в результате. Конечный пользователь не формирует HTTP-запросы POST на ресурсы в вашем приложении, пользователь нажимает кнопки, щелкает ajax-ссылки, перетаскивает n элементов, отправляет веб-формы и т. Д.
Ознакомьтесь с этим сообщением в блоге о Capybara и других методах HTTP. Автор предъявляет следующие претензии:
Вы видели какие-либо упоминания о таких методах, как получение, публикация или ответ? Нет? Это потому, что их нет в Капибаре. Давайте проясним это ... Capybara - это не библиотека, подходящая для тестирования API. Там у вас есть это. Не тестируйте API с помощью Capybara. Он не был предназначен для этого.
Итак, разрабатываете API или нет, если вам нужно сделать явный HTTP-запрос POST, и он не включает в себя HTML-элемент и какое-то событие (щелчок, перетаскивание, выбор, фокусировка, что угодно), тогда он не должен не тестируйся с капибарой. Если вы можете протестировать ту же функцию, нажав какую-то кнопку, используйте Capybara.
То, что вы, вероятно, хотите, это Спецификации запроса RSpec . Здесь вы можете совершать post
вызовы, а также любые другие методы HTTP и утверждать ожидания в ответе. Вы также можете смоделировать n объектов-заглушек и методы, чтобы утверждать ожидания в отношении побочных эффектов и других действий, которые происходят между вашим запросом и ответом.
# spec located in spec/requests/project_file_upload_spec.rb
require "rails_helper"
RSpec.describe "Project File Upload", type: :request do
let(:project) { create(:project) }
let(:file) { File.new(File.join(::Rails.root.to_s, 'path/to/file.ext')) } # can probably extract this to a helper...
it "accepts a file uploaded to a Project resource" do
post "project/#{project.id}/upload", upload_path: file
expect(response).to be_success
expect(project.file?).to eq(true)
# expect(project.file).not_to eq(nil)
expect(response).to render_template(:show)
end
end