RSpec: ждать альтернативы, чтобы соответствовать - PullRequest
0 голосов
/ 27 июня 2018

Есть несколько статей (например, [1]), касающихся решения нестабильных приемочных испытаний при использовании капибары, которые рекомендуют использовать, например,

.to have_text("foo")

вместо

.to eql("foo")

В одном из моих тестов у меня есть .to match(/foo/), и время от времени это терпит неудачу. Я предполагаю, что совпадение match не относится к той же категории, что и, например, have_text совпадает и не ждет. В документации ничего не сказано об этом.

Есть ли сопоставитель регулярных выражений, чтобы я мог проверить, например,

expect(next_url).to match(/foo/)


Используемые версии (без изменений):

капибара: 2.7.x

Спец-рельсы: 3.6.x

[1] https://www.urbanbound.com/make/fix-flaky-feature-tests-by-using-capybaras-apis-properly

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если у вас есть страница, где элементы имеют задержку, появляющуюся на странице, вы можете определить метод 'wait' в 'capybara_helpers.rb'

def wait_for timeout = 10, &block
Timeout.timeout(timeout) do
  loop do
    condition = yield
    if (condition)
      break true
    end
  end
end

rescue Timeout::Error
  raise "Condition not true in #{timeout} seconds"

конец

После этого вы можете использовать метод wait_for следующим образом:

wait_for { page.has_css?('.class', text: 'Something') }
0 голосов
/ 27 июня 2018

Документы для have_text ссылки на assert_text документы - https://www.rubydoc.info/gems/capybara/Capybara/Node/Matchers#assert_text-instance_method, которые показывают, что требуется либо строка

expect(page).to have_text('Something')

или регулярное выражение

expect(page).to have_text(/foo/)

Как следует из статьи, на которую вы ссылались, если вы обнаружите, что используете какой-либо инструмент, не связанный с capybara, с информацией, возвращенной из Capybara, вы, вероятно, делаете что-то не так и настраиваетесь на нестабильные тесты.

...