Я пытаюсь написать собственный сопоставитель RSpec для использования в системных тестах Rails, работающих под Capybara - идея состоит в том, чтобы сопоставлять текст, игнорируя при этом определенные теги <span>
.
Этоmatcher:
RSpec::Matchers.define :have_cleaned_text do |text|
match do |content|
content.body.include?(text) || content.body.gsub(%r{<span class=["']separator["'].*?>.*?</span>}, ' ').include?(text)
end
end
и тело HTML тестируемой страницы:
<h1>Test Page</h1>
<div id='constraint'>
<p>Clean text</p>
<p>Broken<span class='separator'>|<span>text</p>
</div>
Первые два прохождения теста:
within('#constraint') do
expect(page).to have_cleaned_text('Clean text')
expect(page).to have_cleaned_text('Broken text')
expect(page).not_to have_cleaned_text('Test Page') # fails!
end
… но третий не проходит, поскольку have_cleaned_text
игнорирует блок within
и выполняет тестирование всей страницы.
Как я могу заставить моего сопоставителя соблюдать блок within
?Я ожидал, что он будет передан как content
, а не как целая страница ...