Подтвердить что ты не робот

Тестирование Rspec для html-объектов в содержимом страницы

Я пишу спецификацию запроса и хочу проверить наличие строки "Отчеты" Aging Reports ". Я получаю сообщение об ошибке (недопустимый multibyte char), если я непосредственно помещаю в символ в выражении matcher, поэтому я попробовал это: page.should have_content("Reports » Aging Reports")

Это не соответствует тесту с сообщением:

expected there to be content "Reports » Aging Reports" in "\n Reports » Aging Reports\n

Я пробовал такие вещи, как .html_safe без успеха. Есть ли способ проверить текст, содержащий html-объекты?

Edit:

Здесь соответствующая область источника html:

<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>

4b9b3361

Ответ 1

Вы также можете проверить тестовый источник исходной страницы:

breadcrumb = '<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>'
page.body.should include(breadcrumb)
expect(page.body).to include(breadcrumb) # rspec 2.11+

Сказав это, я не уверен, что самое элегантное решение. Предполагая, что вокруг ваших ссылок есть класс с именем .breadcrumb, вы можете просто подтвердить, что ссылки присутствуют в div:

within '.breadcrumb' do
  page.should have_css('a', text: 'Reports')
  page.should have_css('a', text: 'Aging Reports')
  expect(page).to have_css('a', text: 'Reports') # rspec 2.11+
  expect(page).to have_css('a', text: 'Aging Reports') # rspec 2.11+
end

Таким образом, вы явно ищете href внутри блока breadcrumb.

Ответ 2

html_safe не удаляет html-теги, если это то, что вы хотите.

Если вы удалите теги html перед тестированием, вы можете использовать sanitize gem.

# in Gemfile
gem 'sanitize'

# in testfile
require 'sanitize'
html = Sanitize.clean(page.body.text)
html.should have_content("Reports &raquo; Aging Reports")

Ответ 3

Я нашел обходное решение, которое использует регулярное выражение вместо строки:

find('#breadcrumbs').text.should match(/Reports . Aging Reports/)

Получает текст div breadcrumbs, который содержит текст, который я ищу, поэтому область действия ограничена. Это отлично работает, но я все равно люблю знать, как сопоставлять определенные html-объекты.

Ответ 4

Иногда самое простое решение является правильным, и все просто работает...

page.should have_content("Reports » Aging Reports")