From a94dfbc4d07dcfe53bbea334f7f47f584737a0c0 Mon Sep 17 00:00:00 2001 From: Jonas Nicklas Date: Sun, 2 Mar 2014 15:49:00 +0100 Subject: [PATCH] Raise server errors on visit and synchronize This should hopefully make them appear earlier and be more helpful. --- lib/capybara/node/base.rb | 1 + lib/capybara/session.rb | 14 ++++++++++++-- lib/capybara/spec/session/click_link_spec.rb | 7 +++++++ lib/capybara/spec/session/visit_spec.rb | 7 +++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/capybara/node/base.rb b/lib/capybara/node/base.rb index f305c6a5..7097023d 100644 --- a/lib/capybara/node/base.rb +++ b/lib/capybara/node/base.rb @@ -80,6 +80,7 @@ module Capybara begin yield rescue => e + session.raise_server_error! raise e unless driver.wait? raise e unless catch_error?(e) raise e if (Time.now - start_time) >= seconds diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index d2181c98..01f3b2ea 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -81,12 +81,20 @@ module Capybara assert_no_selector :xpath, "/html/body/*" @touched = false end + raise_server_error! + end + alias_method :cleanup!, :reset! + alias_method :reset_session!, :reset! + + ## + # + # Raise errors encountered in the server + # + def raise_server_error! raise @server.error if Capybara.raise_server_errors and @server and @server.error ensure @server.reset_error! if @server end - alias_method :cleanup!, :reset! - alias_method :reset_session!, :reset! ## # @@ -179,6 +187,8 @@ module Capybara # @param [String] url The URL to navigate to # def visit(url) + raise_server_error! + @touched = true if url !~ /^http/ and Capybara.app_host diff --git a/lib/capybara/spec/session/click_link_spec.rb b/lib/capybara/spec/session/click_link_spec.rb index 436d4caa..43cbd52f 100644 --- a/lib/capybara/spec/session/click_link_spec.rb +++ b/lib/capybara/spec/session/click_link_spec.rb @@ -14,6 +14,13 @@ Capybara::SpecHelper.spec '#click_link' do @session.should have_content('Another World') end + it "raises any errors caught inside the server", :requires => [:server] do + quietly { @session.visit("/error") } + expect do + @session.click_link('foo') + end.to raise_error(TestApp::TestAppError) + end + context "with id given" do it "should take user to the linked page" do @session.click_link('foo') diff --git a/lib/capybara/spec/session/visit_spec.rb b/lib/capybara/spec/session/visit_spec.rb index 82ae7a1c..e9c7b557 100644 --- a/lib/capybara/spec/session/visit_spec.rb +++ b/lib/capybara/spec/session/visit_spec.rb @@ -26,6 +26,13 @@ Capybara::SpecHelper.spec '#visit' do @session.should have_content('Hello world!') end + it "raises any errors caught inside the server", :requires => [:server] do + quietly { @session.visit("/error") } + expect do + @session.visit("/") + end.to raise_error(TestApp::TestAppError) + end + context "when Capybara.always_include_port is true" do let(:root_uri) do