Phlip
2009-Mar-16 03:39 UTC
[rspec-users] [ANN] assert2/xhtml specifies your HTML by example
Rubies: assert_xhtml now works with RSpec. (Call it ".should be_html_with{}" !) This is its Rails functional test aspect: get :edit_user, :id => users(:Moses).id scope = self assert_xhtml do form :action => ''/users'' do fieldset do legend ''Personal Information'' label ''First name'' input :type => ''text'', :name => ''user[first_name]'' :value => scope.users(:Moses).first_name end end end The assertion tests your form "by example". Your page must contain a form with the given action, and it must contain at least the listed elements, attributes, and text. Anything you don''t care about - anything your designers might change - you simply leave out of the example. (The example is actually Nokogiri::HTML::Builder notation, so anything Nokogiri can do, the assertion can do. But that''s why we needed that ''scope'' variable, as a kind of "messenger rope", to call your test-side methods inside the block. Otherwise, Nokogiri would dutifully convert them into HTML!) Here''s a similar test, in RSpec: it ''should have a cute form'' do render ''/users/new'' response.body.should be_html_with{ form :action => ''/users'' do fieldset do legend ''Personal Information'' label ''First nome'' input :type => ''text'', :name => ''user[first_name]'' end end } end Oh, except it has a bug in it! Here''s the diagnostic: ''/users/new should have a cute form'' FAILED Could not find this reference... <form action="/users"> <fieldset> <legend>Personal Information</legend> <label>First nome</label> <input type="text" name="user[first_name]"> </fieldset></form> ...in these sample(s)... <form action="/users"> <fieldset> <legend>Personal Information</legend> <ol> <li id="control_user_first_name"> <label for="user_first_name">First name</label> <input type="text" name="user[first_name]" id="user_first_name"> </li> </ol> </fieldset> </form> Notice, as usual, the specification diagnostic only contained the start of the match. The example with <form action="/users"> worked. That''s all there is to it. Write anything you like inside the block, and if the assertion can''t find it, it will explain why it can''t. Install the gem like this: gem install nokogiri assert2 # make sure the later is 0.3.9! Then use require ''assert2/xhtml'', in either the test/unit or RSpec environments. This project is wide-open for suggestions - with < 200 lines of code there''s plenty of room for more features! -- Phlip http://www.zeroplayer.com/