RSpec: 等待替代匹配

RSpec: wait alternative to match

有一些文章(例如[1])是关于解决使用 Capybara 时出现的不稳定的验收测试,提倡使用例如

.to have_text("foo")

而不是

.to eql("foo")

在我的一项测试中,我有 .to match(/foo/) 并且每隔一段时间就会失败。我假设 match 匹配器与例如不在同一类别中have_text 匹配器并且不等待。该文档没有提及任何相关内容。

是否有任何正则表达式匹配器以便我可以检查例如

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

?


使用的版本(不可更改):

水豚:2.7.x

规格-rails:3.6.x

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

have_text link 的文档到 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/)

正如您 link 所暗示的文章,如果您发现自己使用任何非水豚提供的匹配器以及从水豚返回的信息,您可能做错了什么,并为不稳定的测试做好了准备。

如果您有一个页面,其中的元素在页面上出现延迟,您可以在 'capybara_helpers.rb'

中定义一个 'wait' 方法
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') }