Confusion At Failing Specs


#1

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.


#2

On Fri, Nov 7, 2008 at 4:35 PM, Russell N. removed_email_address@domain.invalid
wrote:

end

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.

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.

Try: template.stub!(:render).with(:partial => anything)


Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com


#3

On Fri, Nov 7, 2008 at 4:35 PM, Russell N. removed_email_address@domain.invalid
wrote:

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

Can you put the rest of the spec and the view in? What failure message
are you getting?


#4

Zach,

Thank you so much. That works for me.

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!

RSL


#5

Per David’s request i made a pastie of the whole view and the whole test
of
an example of this. as well as the output. http://pastie.org/309868

RSL


#6

On Fri, Nov 7, 2008 at 5:17 PM, Russell N. removed_email_address@domain.invalid
wrote:

Zach,

Thank you so much. That works for me.

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”’

Hopefully this helps clear it up?


Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com