Как проверить множественные вхождения слова, используя Capybara (или, наверное, Webrat) и Cucumber? - PullRequest
1 голос
/ 19 ноября 2010

Я знаю, что /Interface \d/ встречается на странице три раза.Но я не знаю, как проверить это с Капибарой в Огурце.Вот моя первая попытка:

Then /^(?:|I )should see \/([^\/]*)\/ (\d+)(?:x|X| times?)?$/ do |regexp, count|
  regexp = Regexp.new(regexp)
  count = count.to_i
  if page.respond_to? :should
    page.should have_xpath('//*', { :text => regexp, :count => count })
  else
    assert page.has_xpath?('//*', { :text => regexp, :count => count })
  end
end

Однако это возвращает false для моего Then I should see /Interface \d+/ 3 times.

. Я понял, что это потому, что has_xpath использует all.Положив это в моем тесте:

puts all(:xpath, '//*', { :text => regexp}).map {|e| pp e}

приводит к

#<Capybara::Element tag="html" path="/html">
#<Capybara::Element tag="body" path="/html/body">
#<Capybara::Element tag="div" path="/html/body/div">
#<Capybara::Element tag="div" path="/html/body/div/div[2]">
#<Capybara::Element tag="table" path="/html/body/div/div[2]/table">
#<Capybara::Element tag="tbody" path="/html/body/div/div[2]/table/tbody">
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[1]">
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[1]/td[3]">
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[2]">
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[2]/td[3]">
#<Capybara::Element tag="tr" path="/html/body/div/div[2]/table/tbody/tr[3]">
#<Capybara::Element tag="td" path="/html/body/div/div[2]/table/tbody/tr[3]/td[3]">

Так что я получаю подсчет каждого шага на пути к элементам, которые содержат мой текст.: - \

Я думал, что, возможно, has_content спасет меня, но он не примет счет.

Помощь!

1 Ответ

2 голосов
/ 22 ноября 2010

Примерно так должно работать:

Then /^(?:|I )should see \/([^\/]*)\/ (\d+)(?:x|X| times?)?$/ do |regexp, count|
  regexp = Regexp.new(regexp)
  count = count.to_i
  page.find(:xpath, '//body').text.split(regexp).length.should == count+1
end
...