Testing helpers that accept a block


#1

Hi,

I am trying to write and test a helper that accepts a block. Right now
it
goes something like this:

module ContactHelper

Wraps a field with div.error if it has an error.

def wrap_error_field errors, &block
field = capture &block
if errors.empty?
concat field
else
concat content_tag(:div, field, :class => ‘error’)
end
end # field_error_helper

This is my first time writing a helper, so please tell me if I’m wrong.

Then, I tried to test it, but couldn’t figure it out, since it seems the
method won’t actually return anything due to the use of concat. The best
I
could figure out for now was to use eval_erb.

require File.expand_path(File.dirname(FILE) + ‘/…/spec_helper’)

describe ContactHelper do

describe “field_error_helper” do

context "when there is an error" do

  it "should wrap the block in div.error" do

    assigns[:errors] = [
      'Error'
    ]

    output = eval_erb <<-ERB
      <% wrap_error_field @errors do %>
        <p>Block</p>
        <% end %>
    ERB

    assert_xhtml output do
      div.error do
        p 'Block'
      end
    end

  end # it should wrap the block in div.error

end # when there is an error

end # describe field_error_helper

end
end

Is that the best/only method? I’m not sure how much I really like it.

Further, when I run the tests, it always outputs “Block” before the test
is
executed, and I can’t figure out why, and that’s slightly annoying.

Thanks,
Brandon


#2

Hi,

Well, I googled some more, and everything I could find used eval_erb. So
is
this the best method for testing helpers with blocks?

And then why is that block displaying when I run the test?

Thanks,
Brandon


#3
    assert_xhtml output do
      div.error do
        p 'Block'
      end
    end

Nokogiri has some “easter eggs” in its ambitious HTML::Builder system.
One of
them is only HTML tags not already recognized as methods can get turned
into
HTML tags. The usual .method_missing() abuse.

The fix is:

     assert_xhtml output do
       div.error do
         p! 'Block'
       end
     end

(Also .be_html_with might work by now… 0.4.9?)

Aaron P. is pondering this issue even now in his subconscious, but I
only ought
to feed him one feature request at a time and a couple others are ahead
in the
queue, so my ! trick has to work for the near future…


#4

Hi,

Oh, I should have thought of that. Thanks a lot.

I’m growing used to the assert_xhtml syntax, lol, so I’ve just been
using
that. Thank you though for fixing the be_html_with syntax.

Brandon