How do you POST to a URL in Capybara?
More recently I found this great blog post. Which is great for the cases like Tony and where you really want to post something in your cuke:
For my case this became:
def send_log(file, project)
proj = Project.find(:first, :conditions => "name='#{project}'")
f = File.new(File.join(::Rails.root.to_s, file))
page.driver.post("projects/" + proj.id.to_s + "/log?upload_path=" + f.to_path)
page.driver.status_code.should eql 200
end
You could do this:
rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.submit :post, your_path, nil
- You can replace
:post
which whatever method you care about e.g.:put
or:delete
. - Replace
your_path
with the Rails path you want e.g.rack_test_session_wrapper.submit :delete, document_path(Document.last), nil
would delete the last Document in my app.
If your driver doesn't have post
(Poltergeist doesn't, for example), you can do this:
session = ActionDispatch::Integration::Session.new(Rails.application)
response = session.post("/mypath", my_params: "go_here")
But note that this request happens in a new session, so you will have to go through the response
object to assert on it.
As has been stated elsewhere, in a Capybara test you typically want to do POSTs by submitting a form just like the user would. I used the above to test what happens to the user if a POST happens in another session (via WebSockets), so a form wouldn't cut it.
Docs:
- http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html
- http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html