Forum: RSpec RSpec 2/Rails 3 - content_for in view specs

Posted by Dylan Markow (Guest)
on 2010-08-19 01:11
(Received via mailing list)
My main layout includes separate content_for/yield sections for my 
header,
sidebar, footer, and content. However, when running a view spec, the
`rendered` variable seems to only contain a string of just the primary
content and ignores the header/footer/sidebar as well as the rest of my
layout file (the "render" call just returns my primary content wrapped 
in
generic <html> and <body> tags).

Is there a way to get to the content captured in a "content_for" block
through my view specs, or at the very least get my "render" call to use 
the
full layout?

I've tried doing a "render :layout => 'application'" which gives me:

1) contacts/show.html.erb shows a URL if the contact has one
    Failure/Error: render :layout => "application"
    undefined method `formats' for nil:NilClass
    #
/home/dylan/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/whiny_nil.rb:48:in
`method_missing'
    #
/home/dylan/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_view/render/rendering.rb:25:in
`render'
    #
/home/dylan/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_view/test_case.rb:103:in
`render'
    #
/home/dylan/.rvm/gems/ruby-1.9.2-p0/gems/rspec-rails-2.0.0.beta.19/lib/rspec/rails/example/view_example_group.rb:73:in
`render'
    # ./spec/views/contacts/show.html.erb_spec.rb:20:in `block (2 
levels) in
<main>'

I've also tried using response.capture(:sidebar), response[:sidebar],
rendered.capture(:sidebar), rendered[:sidebar], view.capture(:sidebar), 
etc.
and none of them worked -- they all give various errors.

Here is my view spec that I'm trying to run:

describe "contacts/show.html.erb" do
  it "shows a URL if present" do
    @contact = Factory(:complete_contact, :web_page => "
http://www.example.com") # Using Factory Girl
    render
    rendered.should have_selector("span", :content => "
http://www.example.com")
  end
end

Thank you!

Dylan Markow
dmarkow@gmail.com
Posted by Michael Schuerig (Guest)
on 2010-08-29 01:24
(Received via mailing list)
On Thursday 19 August 2010, Dylan Markow wrote:
> Is there a way to get to the content captured in a "content_for"
> block through my view specs, or at the very least get my "render"
> call to use the full layout?

Try defining a method like this in your spec

  def content_for(name)
    view.instance_variable_get(:@_content_for)[name]
  end

and then

  content_for(:sidebar).should ...


Michael

--
Michael Schuerig
mailto:michael@schuerig.de
http://www.schuerig.de/michael/
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.