RSpec:等待替代匹配

Posted

技术标签:

【中文标题】RSpec:等待替代匹配【英文标题】:RSpec: wait alternative to match 【发布时间】:2018-06-27 04:45:04 【问题描述】:

有一些文章(例如 [1])关于在使用 Capybara 时解决易碎的验收测试,其中提倡使用例如

.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

【问题讨论】:

【参考方案1】:

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 返回的信息,那么您可能做错了什么,并且为易碎测试做好了准备。

【讨论】:

【参考方案2】:

如果您有一个页面,其中元素在页面上出现延迟,您可以在 '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') 

【讨论】:

如果整个团队在几种情况下使用这将增加整体测试时间,这就是我们避免这种结构的原因。 我完全同意你的看法。但在某些情况下,这种方法很有用,尤其是当您有一些动画在页面上出现延迟时,您需要检查它们。

以上是关于RSpec:等待替代匹配的主要内容,如果未能解决你的问题,请参考以下文章

在运行脚本之前使用 inotifywait (或替代方法)等待 rsync 传输完成?

Mockito:等待与参数匹配的调用

Swift Quick/Nimble - 等待谓词匹配

在等待与 WritableServerSelector 匹配的服务器时超时 30000 毫秒

多线程的等待唤醒(使用监视器)

等待与 WritableServerSelector 匹配的服务器时,在 30000 毫秒后超时。状态 = 已连接