Test HTML output from Rails helper

Hi

I’m using RSpec in with Ruby on Rails. I’ve made a helper module
method that generates some HTML and would like to create a rspec test
to validate this HTML. I can of cause use regex to validate it as a
string, but would much rather validate it by traversing the DOM and
checking that the elements I expect is present. Any pointers?

/thomas

On Oct 18, 2008, at 4:40 AM, Thomas W. Steen wrote:

Hi

I’m using RSpec in with Ruby on Rails. I’ve made a helper module
method that generates some HTML and would like to create a rspec
test to validate this HTML. I can of cause use regex to validate it
as a string, but would much rather validate it by traversing the DOM
and checking that the elements I expect is present. Any pointers?

No - that’s not really an option. The rails stack has no idea about a
DOM.

One option, though, is to stub methods and use message expectations.
For instance, if you had a helper like the following:

module MyHelper
def my_method(a_name)
link_to(a_name, {:controller => “foo”, :action => “foo”})
end
end

You’d be able to write a spec like the following:

it “should link with the correct name” do
helper.should_receive(:link_to).with(“foo”, {:controller =>
“foo”, :action => “foo”})
helper.my_method(“foo”)
end

Hope that helps,

Scott

Scott T. [email protected] writes:

No - that’s not really an option. The rails stack has no idea about a
DOM.

Hrm…he’s just generating HTML, he should be able to use Hpricot.
Does have_tag work with plain strings, or only in examples where there’s
a response body? If it’s the latter, we should make it work with plain
strings as well. But Hpricot would certainly be useful I would think.

You’d be able to write a spec like the following:

it “should link with the correct name” do
helper.should_receive(:link_to).with(“foo”, {:controller => “foo”,
:action => “foo”})
helper.my_method(“foo”)
end

I don’t like this, I don’t think you’re testing anything here.

Pat

On 2008-10-18, at 09:16, Pat M. wrote:

Pat

Hi Pat. I’m interested to hear how you’d spec that helper method,
because some of specs are similar to what Scott proposed, and I’m
always looking to improve them.

Cheers,
Nick

On Sat, Oct 18, 2008 at 11:34 AM, Nick H. [email protected]
wrote:

end

I don’t like this, I don’t think you’re testing anything here.

Pat

Hi Pat. I’m interested to hear how you’d spec that helper method, because
some of specs are similar to what Scott proposed, and I’m always looking to
improve them.

I’m pretty sure Pat is simply suggesting:

it “should link with the correct name” do
helper.my_method(“foo”).should have_tag(“a[href=?]”, the_path,
“foo”)
end

If my_method returns a string then have_tag will work. If my_method
returns an object that responds to “body” then it will also work (this
is how response.should have_tag(‘…’) works as well,


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

On Sat, Oct 18, 2008 at 6:16 AM, Pat M. [email protected] wrote:

Does have_tag work with plain strings

Yep, it does. That’s how I spec #to_amcharts. :slight_smile:

///ark

On Oct 18, 2008, at 9:16 AM, Pat M. wrote:

and checking that the elements I expect is present. Any pointers?
strings as well. But Hpricot would certainly be useful I would think.

Yeah. +1. Not sure why I didn’t think of that.

Scott

On Oct 18, 2008, at 10:50 am, Scott T. wrote:

No - that’s not really an option. The rails stack has no idea about
a DOM.

One option, though, is to stub methods and use message
expectations. For instance, if you had a helper like the following:

Hi Scott

Another option would be Hpricot[1], which makes manipulating HTML
easier than CSV data.

Ashley

[1] http://code.whytheluckystiff.net/hpricot/


http://www.patchspace.co.uk/

“Zach D.” [email protected] writes:

helper.my_method(“foo”)

I’m pretty sure Pat is simply suggesting:

it “should link with the correct name” do
helper.my_method(“foo”).should have_tag(“a[href=?]”, the_path, “foo”)
end

Yup

Pat