Can someone please explain to me why this spec fails
it “should work” do
template.stub!(:render)
template.should_receive(:render).with(:partial => “foo”)
render @template_with_render_partial_foo
end
but this spec passes
it “should work” do @foo.stub!(:bar) @foo.should_receive(:bar).with(:baz) @foo.bar :baz
end
It seems like they should work similarly and indeed this has worked for
me
until I switched to gem rspec-rails from vendor/plugin [recent]. Not
sure
what I’m doing wrong here.
It seems like they should work similarly and indeed this has worked for me
until I switched to gem rspec-rails from vendor/plugin [recent]. Not sure
what I’m doing wrong here.
In the first example, you call “stub!(:render)”. This is stubbing all
calls to render with any arguments. So you’ve stubbed the call that
“render @template_with_render_partial_foo” makes.
I’m still confused why stubbing all calls to :bar on @foo would allow @foo.should_receive(:bar).with(:baz) when this doesn’t work though. But
I
feel like I’m looking a gift horse in the mouth here!
I’m still confused why stubbing all calls to :bar on @foo would allow @foo.should_receive(:bar).with(:baz) when this doesn’t work though. But I
feel like I’m looking a gift horse in the mouth here!
The reason this doesn’t work is because rspec’s “render” method in
your view example is just wrapping a call to the actual template.
Here’s what I mean. Given your example:
it “should work” do
template.stub!(:render)
template.should_receive(:render).with(:partial => “foo”)
render @template_with_render_partial_foo
# in your view you call <%= render :partial => “foo” %>
end
Here’s what it is really doing:
it “should work” do @controller.template.stub!(:render) @controller.template.should_receive(:render).with(:partial => “foo”) @controller.template.render@template_with_render_partial_foo
# in your view you call <%= render :partial => “foo” %> @controller.template.render :partial => “foo”
end
The @controller.template is the actual template that gets rendered.
The “render” call in your example is made on the same template object
that the actual “render :partial” call is made on. So, when you make
the call to render the @template_with_render_partial_foo you have
stubbed out that render method and it never actually renders anything
causing your example to fail because it never gets to the view
template that calls ‘render :partial => “foo”’