Проверка на наличие последовательных элементов HTML в представлении Rails

#ruby-on-rails #testing #minitest

#ruby-on-rails #тестирование #minitest

Вопрос:

Я хочу запустить тест *, чтобы проверить наличие чего-то подобного:

 <tr>
    <td> name </td> <td> date </td>
</tr>
 

Код, такой как показано ниже:

 assert_select "tr" do
  assert_select "td",  name
  assert_select "td",  date
end
 

выглядит правдоподобно, но неверно, так как приведенный ниже пример (который не является требуемым совпадением) также пройдет:

 <tr>
    <td> name </td>
</tr>
<tr>
    <td> date </td>
</tr>
 

Я изо всех сил пытаюсь понять, как к этому следует подходить из документации assert_select .

Спасибо

Даниэль

  • в рамках теста интеграции Rails по умолчанию (я полагаю, это означает MiniTest)

Комментарии:

1. У CSS есть селектор родственных элементов, который был td td бы, но у него нет селекторов, основанных на текстовом узле. Ваш лучший выбор, если вы не можете добавлять классы или атрибуты данных, вероятно, использовать assert_select 'td', exp where exp — регулярное выражение, соответствующее узлам. Вы также можете использовать css_select его для выбора элементов td и перебора по ним. Если он ведет себя как перечисляемый, вы должны иметь возможность использовать with_index для сравнения с предыдущим элементом в наборе.

2. Спасибо за указатели в правильном направлении @max. Для информации, селектор родственных элементов не вернет первый td (в данном контексте), только последующие родственные элементы. css_select возвращает что-то из класса Nokogiri::XML::NodeSet , который отвечает на each_with_index .

Ответ №1:

В итоге я использовал регулярные выражения для результата css_select, что кажется немного неэлегантным, но работало для моих целей. Если есть лучший способ, мне было бы интересно его услышать. Я использовал что-то вроде этого:

 pars = css_select "tr"
regexs = /<td>#{name}</td>.*<td>#{date}</td>/m
match = false
pars.each { |i| if i.to_s =~ regexs then match = true end}
assert match