Hi,
I've been stumped about this for days now. I'm using RSpec for BDD, and tried creating a custom matcher to test for the existence of a form on a page.
The custom matcher is:
An example of one of the examples using it:Code:require 'webrat/core/matchers/have_selector' module FormMatchers class HaveAFormWithID include Webrat::Matchers def initialize id, &block @id = id @block = block end def matches? response, &block @block ||= block response.should have_selector('form#%s' % [@id]) do |form| !@block or @block.call form end end def description "have a form with id #{@id}" end def failure_message "expected to have a form with ID #{@id}" end def negative_failure_message "expected not to have a form with ID #{@id}" end end def have_a_form_with_id id, &block HaveAFormWithID.new id, &block end end
That fails. However, if no block is passed, it passes, such as the following:Code:it "should have a subject dropdown box" do response.should have_a_contact_form do |form| form.should have_selector('select', :id => 'subject') end end # it "should have a subject dropdown box"
Yes, I have a method have_a_contact_form that calls the have_a_form_with_id method.Code:it "should show the contact form" do response.should have_a_contact_form end
Anyway, when it fails, I get the error:Code:def have_a_contact_form &block have_a_form_with_id 'contact', &block end
As you can see, that selector clearly does exist on the page, so it confuses me why it is failing.Code:'/contact/index the contact form before it has been submitted should have a subject dropdown box' FAILED expected following output to contain a <select id='subject'/> tag: <form action="/contact.html" id="contact" method="post"> <div> <label for="subject">Subject</label> <select id="subject" name="subject"><option value=""></option> <option value="feedback">Feedback</option> <option value="questions">Questions</option> <option value="suggestions">Suggestions</option> <option value="other">Other</option></select> </div> </form>
Thanks in advance for any help.
Brandon







Bookmarks