Как я могу использовать assert_select в функциональном тесте Rails, чтобы проверить наличие нескольких элементов одного типа, различающихся только текстом? - PullRequest
2 голосов
/ 29 марта 2011

У меня есть представление Rails, которое выводит HTML примерно так:

<html>
  <body>
    <h1>Keywords</h1>

    <h2>EN</h2>
    <h3>Accepted</h3>
    <ul>
      <li>Foo</li>
    </ul>
    <h3>Rejected</h3>
    <ul>
      <li>Bar</li>
    </ul>

    <h2>SV</h2>
    <h3>Accepted</h3>
    <ul>
      <li>Föö</li>
    </ul>
    <h3>Rejected</h3>
    <ul>
      <li>Bär</li>
    </ul>
  </body>
</html>

Я хотел бы использовать assert_select, чтобы убедиться, что у меня есть <h2> теги для каждого языка:

languages.each do |language|
  assert_select 'body > h2', :text => language.upcase
end
* 1008.

1 Ответ

2 голосов
/ 29 марта 2011

Я нашел хакерское решение (благодаря классу HTML :: Tag в записи scrapi в блоге QuarkRuby) с использованием недокументированного класса HTML::Tag, получаемого assert_select в виде блока:

# Count the <h2> tags and accumulate their text content
h2_texts = nil
assert_select('body > h2', :count => languages.size) do |elements|
   h2_texts = elements.map {|element| element.children.first.content }
end
languages.each do |language|
  assert h2_texts.include?(language.upcase), "<h2> tag for #{language} exists"
end

Полагаю, assert_select просто не может этого сделать, или может, и это не задокументировано. Я думаю, мне придется UTSL ...

...