Тестирование Rspec для html-сущностей в содержимом страницы - PullRequest
12 голосов
/ 07 октября 2011

Я пишу спецификацию запроса и хотел бы проверить наличие строки «Отчеты» Отчеты о старении ». Я получаю сообщение об ошибке (недопустимый многобайтовый символ), если я непосредственно вставляю символ в выражение соответствия, поэтому я попробовал это: 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>

Ответы [ 4 ]

7 голосов
/ 25 октября 2012

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

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

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

4 голосов
/ 21 июня 2013

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")
1 голос
/ 09 октября 2011

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

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

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

0 голосов
/ 18 сентября 2013

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

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