Rspec render :update

Hi all,

I’m having trouble with rspec 1.1.4 and rjs

In the controller:
render :update do |page|
page << ‘added text’
end

render :update do |page|
page.replace_html :divid :partial => ‘apartial’
end

spec:

response.should have_rjs #this should be successful for any rjs
request; but fails

response.should have_rjs(:replace_html) #no luck

I have tried mocking the page object, but that also fails.

e.g
@page = mock('page)
@page.should_receive(:replace_html)

What’s the best practice to validate rjs responses?

Thanks in advance

On Jul 11, 2008, at 1:04 PM, Reggie Mr. wrote:

e.g
@page = mock('page)
@page.should_receive(:replace_html)

What’s the best practice to validate rjs responses?

I use the ARTS plugin to validate RJS.
(GitHub - richpoirier/arts: Mirror of the ARTS Rails plugin.
)
After you install it, you can do things like:

 it "should render edit template" do
   do_get

   assert_rjs :page, 'error_div', :hide
   assert_rjs :replace_html, "edit_div"
   assert_rjs :visual_effect, :scroll_to, 'edit_div'
   assert_rjs :visual_effect, :highlight, "object_#{@object.id}"
 end

Hope this helps!

On Fri, Jul 11, 2008 at 1:04 PM, Reggie Mr. [email protected]
wrote:

   page.replace_html :divid :partial => 'apartial'

e.g
@page = mock('page)
@page.should_receive(:replace_html)

What’s the best practice to validate rjs responses?

I don’t like validating generated JavaScript code from framework methods
(or
well tested third party libraries) against helper methods which just use
regular expression matching underneath the covers (like ARTS or the
built-in
Rails helpers).

I like to let the framework and the third party libraries test that
their
generated JavaScript is correct and I like to make sure my code is just
doing the right thing using mocks.

The below is a spec that will ensure a “render :update” call inside a
controller action works…

describe SomeController, ‘#foo’ do
it “renders the items entry form” do
page = mock(“page”)
controller.expect_render(:update).and_yield(page)
page.should_receive(:replace_html).with(:some_id, partial =>
“items/form”)
get :show, :id => 1, :expense_reimbursement_id => 2
end
end

And here’s the controller method:

def show
render :update do |page|
page.replace_html :some_id, :partial => “Items/form”
end
end

I like to keep my RJS separate from my controller as much as possible by
pushing the code into external RJS files. This helps keep the controller
simple and easily understandable. I know sometimes the controller action
and
the RJS are both so simple that it seems like overkill to separate them.
This just becomes a judgment call by the developer. If the controller
action
or the inline RJS grows it’s pretty simple to extract an RJS file after
the
fact.

When an RJS file becomes messy or difficult to understand you can
refactor
that into using Renderer objects. For more information see “Extract
Renderer
from RJS” in the Rails Refactoring Catalog:
http://assets.en.oreilly.com/1/event/6/Refactoring%20Your%20Rails%20Application%20Paper.pdf