#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
whereexp
— регулярное выражение, соответствующее узлам. Вы также можете использовать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