Hello, I am trying to run this integration test of my user controller within a rails 3 application: # spec/requests/users_spec.rb require ''spec_helper'' describe "Users" do describe "success" do it "should make a new user" do lambda do visit signup_path fill_in "Name", :with => "Example User" fill_in "Email", :with => "user at example.com" fill_in "Password", :with => "foobar" fill_in "Confirmation", :with => "foobar" click_button "Sign up" page.should have_css("div.flash.success", :text => "Welcome") response.should render_template("user/show") end.should change(User, :count).by(1) end end end The test fails when render_template is being called: daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec spec/requests/users_spec.rb -e "should make a new user" Run filtered using {:full_description=>/(?-mix:should make a new user)/} F Failures: 1) Users signup success should make a new user Failure/Error: response.should render_template("user/show") @request must be an ActionDispatch::Request # ./spec/requests/users_spec.rb:34 # ./spec/requests/users_spec.rb:26 Finished in 0.41306 seconds 1 example, 1 failure I am using rspec-rails (2.0.0.beta.20) with capybara (0.3.9). What am I missing here? For what it''s worth I have verified the behaviour manually: registering a new user does indeed take me to the show page. Thanks in advance! Daniel
On Sep 4, 8:41?pm, Daniel Lidstr?m <dlidst... at gmail.com> wrote:> ? ? ? ? ? response.should render_template("user/show")I noticed a mistake on the above line. However, the correct line (with "users/show") also fails: daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ ls app/ views/users/show.html.erb app/views/users/show.html.erb daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec spec/requests/users_spec.rb -e "should make a new user" Run filtered using {:full_description=>/(?-mix:should make a new user)/} F Failures: 1) Users signup success should make a new user Failure/Error: response.should render_template("users/show") @request must be an ActionDispatch::Request # ./spec/requests/users_spec.rb:34 # ./spec/requests/users_spec.rb:26 Finished in 0.27922 seconds 1 example, 1 failure
On Sep 4, 2010, at 1:41 PM, Daniel Lidstr?m wrote:> Hello, > > I am trying to run this integration test of my user controller within > a rails 3 application: > > # spec/requests/users_spec.rb > > require ''spec_helper'' > > describe "Users" do > > describe "success" do > > it "should make a new user" do > lambda do > visit signup_path > fill_in "Name", :with => "Example User" > fill_in "Email", :with => "user at example.com" > fill_in "Password", :with => "foobar" > fill_in "Confirmation", :with => "foobar" > click_button "Sign up" > page.should have_css("div.flash.success", :text => > "Welcome") > response.should render_template("user/show") > end.should change(User, :count).by(1) > end > end > end > > The test fails when render_template is being called: > > daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec > spec/requests/users_spec.rb -e "should make a new user" > Run filtered using {:full_description=>/(?-mix:should make a new > user)/} > F > > Failures: > 1) Users signup success should make a new user > Failure/Error: response.should render_template("user/show") > @request must be an ActionDispatch::Request > # ./spec/requests/users_spec.rb:34 > # ./spec/requests/users_spec.rb:26 > > Finished in 0.41306 seconds > 1 example, 1 failure > > I am using rspec-rails (2.0.0.beta.20) with capybara (0.3.9). What am > I missing here? For what it''s worth I have verified the behaviour > manually: registering a new user does indeed take me to the show page. > Thanks in advance!The problem is that capybara doesn''t assign anything to the @request variable after visit, so it doesn''t support any of the built-in rails assertions that rely on @request, and render_template delegates to assert_template. I''d file a bug with capybara on this one. Cheers, David
On Sep 4, 2010, at 2:26 PM, David Chelimsky wrote:> > On Sep 4, 2010, at 1:41 PM, Daniel Lidstr?m wrote: > >> Hello, >> >> I am trying to run this integration test of my user controller within >> a rails 3 application: >> >> # spec/requests/users_spec.rb >> >> require ''spec_helper'' >> >> describe "Users" do >> >> describe "success" do >> >> it "should make a new user" do >> lambda do >> visit signup_path >> fill_in "Name", :with => "Example User" >> fill_in "Email", :with => "user at example.com" >> fill_in "Password", :with => "foobar" >> fill_in "Confirmation", :with => "foobar" >> click_button "Sign up" >> page.should have_css("div.flash.success", :text => >> "Welcome") >> response.should render_template("user/show") >> end.should change(User, :count).by(1) >> end >> end >> end >> >> The test fails when render_template is being called: >> >> daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec >> spec/requests/users_spec.rb -e "should make a new user" >> Run filtered using {:full_description=>/(?-mix:should make a new >> user)/} >> F >> >> Failures: >> 1) Users signup success should make a new user >> Failure/Error: response.should render_template("user/show") >> @request must be an ActionDispatch::Request >> # ./spec/requests/users_spec.rb:34 >> # ./spec/requests/users_spec.rb:26 >> >> Finished in 0.41306 seconds >> 1 example, 1 failure >> >> I am using rspec-rails (2.0.0.beta.20) with capybara (0.3.9). What am >> I missing here? For what it''s worth I have verified the behaviour >> manually: registering a new user does indeed take me to the show page. >> Thanks in advance! > > The problem is that capybara doesn''t assign anything to the @request variable after visit, so it doesn''t support any of the built-in rails assertions that rely on @request, and render_template delegates to assert_template.For more context, this works fine with the rails built-in get, post, etc methods: get things_path response.should render_template("things/index") ... as well as webrat''s visit method: visit things_path response.should render_template("things/index") That''s why I say it''s really a capybara issue. Make sense?> I''d file a bug with capybara on this one. > > Cheers, > David
Capybara is not a rails-specific solution so it doesn''t know anything about rails''s rendering logic etc. I''m also fairly sure Jonas will say that it''s something that won''t be implemented. I think the key thing here is that rendering a template is a controller level thing and Capybara is designed to be an acceptance testing tool, hence you need to test results and not implementation with it. - Toni On Sat, Sep 4, 2010 at 10:29 PM, David Chelimsky <dchelimsky at gmail.com> wrote:> > On Sep 4, 2010, at 2:26 PM, David Chelimsky wrote: > >> >> On Sep 4, 2010, at 1:41 PM, Daniel Lidstr?m wrote: >> >>> Hello, >>> >>> I am trying to run this integration test of my user controller within >>> a rails 3 application: >>> >>> # spec/requests/users_spec.rb >>> >>> require ''spec_helper'' >>> >>> describe "Users" do >>> >>> ? describe "success" do >>> >>> ? ? it "should make a new user" do >>> ? ? ? lambda do >>> ? ? ? ? visit signup_path >>> ? ? ? ? fill_in "Name", :with => "Example User" >>> ? ? ? ? fill_in "Email", :with => "user at example.com" >>> ? ? ? ? fill_in "Password", :with => "foobar" >>> ? ? ? ? fill_in "Confirmation", :with => "foobar" >>> ? ? ? ? click_button "Sign up" >>> ? ? ? ? page.should have_css("div.flash.success", :text => >>> "Welcome") >>> ? ? ? ? response.should render_template("user/show") >>> ? ? ? end.should change(User, :count).by(1) >>> ? ? end >>> ? end >>> end >>> >>> The test fails when render_template is being called: >>> >>> daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec >>> spec/requests/users_spec.rb -e "should make a new user" >>> Run filtered using {:full_description=>/(?-mix:should make a new >>> user)/} >>> F >>> >>> Failures: >>> 1) Users signup success should make a new user >>> ? ?Failure/Error: response.should render_template("user/show") >>> ? ?@request must be an ActionDispatch::Request >>> ? ?# ./spec/requests/users_spec.rb:34 >>> ? ?# ./spec/requests/users_spec.rb:26 >>> >>> Finished in 0.41306 seconds >>> 1 example, 1 failure >>> >>> I am using rspec-rails (2.0.0.beta.20) with capybara (0.3.9). What am >>> I missing here? For what it''s worth I have verified the behaviour >>> manually: registering a new user does indeed take me to the show page. >>> Thanks in advance! >> >> The problem is that capybara doesn''t assign anything to the @request variable after visit, so it doesn''t support any of the built-in rails assertions that rely on @request, and render_template delegates to assert_template. > > For more context, this works fine with the rails built-in get, post, etc methods: > > ?get things_path > ?response.should render_template("things/index") > > ... as well as webrat''s visit method: > > ?visit things_path > ?response.should render_template("things/index") > > That''s why I say it''s really a capybara issue. Make sense? > >> I''d file a bug with capybara on this one. >> >> Cheers, >> David > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
On Sep 4, 2010, at 3:15 PM, Toni Tuominen wrote:> On Sat, Sep 4, 2010 at 10:29 PM, David Chelimsky <dchelimsky at gmail.com> wrote: >> >> On Sep 4, 2010, at 2:26 PM, David Chelimsky wrote: >> >>> >>> On Sep 4, 2010, at 1:41 PM, Daniel Lidstr?m wrote: >>> >>>> Hello, >>>> >>>> I am trying to run this integration test of my user controller within >>>> a rails 3 application: >>>> >>>> # spec/requests/users_spec.rb >>>> >>>> require ''spec_helper'' >>>> >>>> describe "Users" do >>>> >>>> describe "success" do >>>> >>>> it "should make a new user" do >>>> lambda do >>>> visit signup_path >>>> fill_in "Name", :with => "Example User" >>>> fill_in "Email", :with => "user at example.com" >>>> fill_in "Password", :with => "foobar" >>>> fill_in "Confirmation", :with => "foobar" >>>> click_button "Sign up" >>>> page.should have_css("div.flash.success", :text => >>>> "Welcome") >>>> response.should render_template("user/show") >>>> end.should change(User, :count).by(1) >>>> end >>>> end >>>> end >>>> >>>> The test fails when render_template is being called: >>>> >>>> daniel at ubuntu /home/daniel/programming/bowling (signing-up) $ rspec >>>> spec/requests/users_spec.rb -e "should make a new user" >>>> Run filtered using {:full_description=>/(?-mix:should make a new >>>> user)/} >>>> F >>>> >>>> Failures: >>>> 1) Users signup success should make a new user >>>> Failure/Error: response.should render_template("user/show") >>>> @request must be an ActionDispatch::Request >>>> # ./spec/requests/users_spec.rb:34 >>>> # ./spec/requests/users_spec.rb:26 >>>> >>>> Finished in 0.41306 seconds >>>> 1 example, 1 failure >>>> >>>> I am using rspec-rails (2.0.0.beta.20) with capybara (0.3.9). What am >>>> I missing here? For what it''s worth I have verified the behaviour >>>> manually: registering a new user does indeed take me to the show page. >>>> Thanks in advance! >>> >>> The problem is that capybara doesn''t assign anything to the @request variable after visit, so it doesn''t support any of the built-in rails assertions that rely on @request, and render_template delegates to assert_template. >> >> For more context, this works fine with the rails built-in get, post, etc methods: >> >> get things_path >> response.should render_template("things/index") >> >> ... as well as webrat''s visit method: >> >> visit things_path >> response.should render_template("things/index") >> >> That''s why I say it''s really a capybara issue. Make sense? >> >>> I''d file a bug with capybara on this one.Please post at the bottom or in-line (I move your post from the top).> Capybara is not a rails-specific solution so it doesn''t know anything > about rails''s rendering logic etc. I''m also fairly sure Jonas will say > that it''s something that won''t be implemented.Makes sense. So if we decided this was a bug, which lib should own this?> I think the key thing here is that rendering a template is a > controller level thing and Capybara is designed to be an acceptance > testing tool, hence you need to test results and not implementation > with it.+1 Cheers, David
> >> Capybara is not a rails-specific solution so it doesn''t know anything >> about rails''s rendering logic etc. I''m also fairly sure Jonas will say >> that it''s something that won''t be implemented. > > Makes sense. So if we decided this was a bug, which lib should own this?Personally I don''t see why rspec needs to offer integration level tools in controller specs at all. If people want to render views and assert the rendered content I think they should use this gem for that http://github.com/grimen/rspec_tag_matchers. Overall it''s an excellent tool for any case where you need to assert html. I''ve found it to be of great value in helper specs.