When talking about upgrading memory to Rails 3.0, I mentioned that I’d had trouble testing a bit of the unobtrusive JavaScript code. Specifically, I had a file answer.js.erb that contained the following:
$('answer').update("<%= escape_javascript(render :partial =>
'answer', :object => @item) %>");
and I wanted to take apart the HTML returned by that render :partial section.
I eventually came up with a solution that I’m happy with, so I’ll mention it here in case anybody else runs into the same problem and ends up here via Googling.
The partial in question contained a p element with class qa; let’s assume that it’s body is supposed to be text_to_assert_on. Then here’s the test that I ended up with:
def unescape_javascript(escaped)
escaped.gsub("\\'", "'").gsub("\\\"", "\"").gsub("\\n", "\n").
gsub("\\\\", "\\").gsub("<\\/", "</")
end
def assert_encoded_update(body, element_to_update)
assert_not_nil(/\$\('(.*)'\)\.update\("(.*)"\);/ =~ body)
assert_equal(element_to_update, $1)
yield(HTML::Document.new(unescape_javascript($2)).root)
end
def test_get_answer
get :index
post :answer, :format => 'js', :item => @one.id
assert_encoded_update(response.body, "answer") do |replacement|
assert_select(replacement, "p.qa", "text_to_assert_on")
end
end
I don’t claim that this is perfect (there are probably more cases that unescape_javascript should handle), but it worked well for my purpose.
Post Revisions:
This post has not been revised since publication.
Posts