Render_template failure

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 => "[email protected]"
      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@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, 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 => "[email protected]"
     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@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, 8:41 pm, Daniel Lidström [email protected] 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@ubuntu /home/daniel/programming/bowling (signing-up) $ ls app/
views/users/show.html.erb
app/views/users/show.html.erb
daniel@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 2:26 PM, David C. 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 => "[email protected]"
    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@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?

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

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.