Thomas Watson Steen
2008-Oct-18 08:40 UTC
[rspec-users] 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 Watson 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
On Oct 18, 2008, at 10:50 am, Scott Taylor 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/ http://aviewfromafar.net/
Scott Taylor <mailing_lists at railsnewbie.com> writes:> On Oct 18, 2008, at 4:40 AM, Thomas Watson 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.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") > endI don''t like this, I don''t think you''re testing anything here. Pat
On 2008-10-18, at 09:16, Pat Maddox wrote:> Scott Taylor <mailing_lists at railsnewbie.com> writes: >> 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. > > PatHi 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 6:16 AM, Pat Maddox <pergesu at gmail.com> wrote:> Does have_tag work with plain strings >Yep, it does. That''s how I spec #to_amcharts. :) ///ark -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20081018/44c3babc/attachment.html>
On Sat, Oct 18, 2008 at 11:34 AM, Nick Hoffman <nick at deadorange.com> wrote:> On 2008-10-18, at 09:16, Pat Maddox wrote: >> >> Scott Taylor <mailing_lists at railsnewbie.com> writes: >>> >>> 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 > > 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 Dennis http://www.continuousthinking.com http://www.mutuallyhuman.com
On Oct 18, 2008, at 9:16 AM, Pat Maddox wrote:> Scott Taylor <mailing_lists at railsnewbie.com> writes: > >> On Oct 18, 2008, at 4:40 AM, Thomas Watson 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. > > 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. >Yeah. +1. Not sure why I didn''t think of that. Scott
"Zach Dennis" <zach.dennis at gmail.com> writes:> On Sat, Oct 18, 2008 at 11:34 AM, Nick Hoffman <nick at deadorange.com> wrote: >> On 2008-10-18, at 09:16, Pat Maddox wrote: >>> >>> Scott Taylor <mailing_lists at railsnewbie.com> writes: >>>> >>>> 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 >> >> 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") > endYup Pat