What is :chained_replace_html ?

1 view
Skip to first unread message

Nick Hoffman

unread,
Sep 29, 2008, 10:39:25 AM9/29/08
to rubyonra...@googlegroups.com
I'm testing an XHR, and until I discovered :chained_replace_html , the
test wasn't seeing that a <div> was being hidden.
=== map_filter.rjs
22 page['map-filter-errors'].hide
===

Why does line 433 above fail?:
=== neighbourhoods_controller_spec.rb
432 do_xhr @xhr_params
433 assert_select_rjs :hide
=== The test's output
No RJS statement that replaces or inserts HTML content.
===

But when I change the test to this, the test succeeds:
=== neighbourhoods_controller_spec.rb
432 do_xhr @xhr_params
433 assert_select_rjs :chained_replace_html
===

I've googled around, read the source for #assert_select_rjs , but
can't figure out what :chained_replace_html is, means, when it should
be used, etc.

So, I have three questions:
1) Why does passing :hide to #assert_select_rjs fail to see the RJS
change?
2) What is :chained_replace_html ?
3) When should :chained_replace_html be used?

Thanks!
Nick

Nick

unread,
Sep 30, 2008, 6:46:00 PM9/30/08
to Ruby on Rails: Talk
On the rspec-users mailing list, Zach Dennis had a great response to
my question:

------------------------------
On Sun, Sep 28, 2008 at 11:59 PM, Nick Hoffman <ni...@deadorange.com>
wrote:
I just discovered that I need to pass :chained_replace_html to
#have_rjs ,
like so:
response.should have_rjs(:chained_replace_html, :hide, 'map-filter-
errors')

However, after googling around and looking through the source for
#assert_select_rjs , I have no idea what :chained_replace_html does,
nor why
:hide is insufficient. Would someone mind enlightening me?
------------------------------
On 2008-09-29, at 19:33, Zach Dennis wrote:
The problem has to do with the javascript that is produced by Rails.
You can do things in RJS in one of two ways.

Way #1:
page[:some_id].hide

Way #2
page.hide :some_id

Based on which way you go Rails will generate Element.hide('some_id')
or $('some_id').hide() IIRC. assert_rjs uses regular expressions to
match against the generated javascript. The fugliness that are these
regular expressions require that two different patterns exist to match
against the generated javascript correctly.

Having chained_replace_html is a hack to separate the regular
expressions based on if you used Way #1 or Way #2.

I have stopped relying on using RJS selectors to test against
generated JavaScript. I have also stopped relying on RJS for the most
part, and instead am doing a lot of UJS and JSON (thx Mark VanHolstyn
for enlightening me on this). I'm not saying that you shouldn't do
this, but that I've hit the problem you're facing, and I don't think
using regular expressions from the bowels of Rails for asserting
against generated javascript is the way to go,

--
Zach Dennis
http://www.continuousthinking.com
http://www.mutuallyhuman.com
------------------------------
Reply all
Reply to author
Forward
0 new messages