Прямо сейчас у меня есть следующий кусок кода:
RSpec::Matchers.define :include_an_html_tag do |tag|
tag = Regexp.escape(tag.to_s)
match do |html|
html.to_s =~ %r[<#{tag}( [^>]+)?>.*?</#{tag}>]m
end
end
RSpec::Matchers.define :have_html_attributes do |tag, attributes_hash|
match do |html|
attributes_hash.all? do |k,v|
html.to_s =~ %r[<#{Regexp.escape tag.to_s}( [^>]+)? #{Regexp.escape k.to_s}\="#{Regexp.escape v.to_s}"( [^>]+)?>]m
end
end
end
html.should include_an_html_tag(:a)
html.should include_an_html_tag(:script)
html.should have_html_attributes(:a, {'data-remote' => 'true', 'data-method' => 'post'})
и работает довольно хорошо.
Что я хочу сделать, так это чтобы каскадеры соответствовали следующим образом:
html.should include_an_html_tag(:a).with_html_attributes('data-remote' => 'true', 'data-method' => 'post')
Есть ли способ добиться последовательности в пользовательских матчах?