Have_tag with a block

This is really a webrat question, but I haven’t had any reaction to
this from the webrat group. Maybe someone here can offer a comment…

I’ve been fooling around with webrat view matchers in merb / cucumber
and I’m trying to figure out whether the block parameter in have_tag
actually does anything. I’ve tried passing a block with pure nonsense
in it and the interpreter just seems to accept it and ignore it as if
it doesn’t exist.

Initially I had hoped there was something like ‘with_tag’ you could
nest inside a block, but I guess that was a rails thing. However from
my quick look at the code, although with fairly limited ruby
experience, I got the impression that ‘have_tag’ passes any matching
markup it finds into the block as a parameter. But none of my
experiments have been able to confirm this.

Does anyone have first hand knowledge of / successful experience with
have_tag with a block?

On Tue, Feb 3, 2009 at 7:52 PM, MarkMT [email protected] wrote:

nest inside a block, but I guess that was a rails thing. However from
my quick look at the code, although with fairly limited ruby
experience, I got the impression that ‘have_tag’ passes any matching
markup it finds into the block as a parameter. But none of my
experiments have been able to confirm this.

Does anyone have first hand knowledge of / successful experience with
have_tag with a block?

Not first hand experience, but I’m looking at the specs in webrat:

If you scroll down to describe “#have_tag”, you’ll see a couple of
examples. It looks like your instinct is at least close to correct.

Can you post an example of what you’re trying to do?

Hi–

On Feb 3, 2009, at 9:44 PM, MarkMT wrote:

New user? Register here
}
end

One of the things I was unsure about was whether I could mix both the
text content and the second tag inside the outer element. Turns out
that this works just fine with the test above. Also, have_tag
(‘div#registration_link’…) works just as well as have_tag(‘div’, :id
=> ‘registration_link’…)

I’m writing a similar kind of scenario and want to make sure I am
scoping my “assertion” (if you will) to the stuff inside the tag. The
idea is that all people to whom this page is addressed are on the
address line (but not necessarily the only thing on the address line.
So the first guess was:

joe, bob

recipients.split(/,\s*/).each do |recipient|
response.should have_tag(‘div[address-line]’, recipient)
end

This doesn’t work. Change the expectation to:

response.should have_tag(‘div[address-line]’, Regexp.new(recipient))

and, predictably, it works. But is that scoped to include only text
that matches the regexp within the div[address-line]?

The code I really wanted to write (phrase stolen from the RSpec Book)
was:

recipients.split(/,\s*/).each do |recipient|
response.should have_tag(‘div[address-line]’) do |r|
r.should include(recipient)
end
end

But that gives me a failed expectation showing a gruesomely
complicated representation of the page DOM and comparing it to ‘joe’.

Question: Is there an accepted way to scope text substrings to within
tags?

Thanks

Thanks David. Those specs are very instructive. I have no idea what I
was doing wrong before, but the behavior I’m seeing now is indeed
consistent with the specs and matches what I had understood from the
code I’d looked at (I suspect it’ll stop working as soon as I send
this :slight_smile: ).

Actually my situation is slightly more complex than what the specs
cover. I have something like this -

New user? Register here

and I’m testing it with a cucumber step that looks like this -

Then /^the response should contain a link to new user registration$/
do
@response.should have_tag(‘div’, :id =>‘registration_link’, :content
=> 'New User? Register ') { |match|
match.should have_tag(‘a’, :href => ‘/User/register’, :content =>
‘here’)
}
end

One of the things I was unsure about was whether I could mix both the
text content and the second tag inside the outer element. Turns out
that this works just fine with the test above. Also, have_tag
(‘div#registration_link’…) works just as well as have_tag(‘div’, :id
=> ‘registration_link’…)

Mark.