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 传输完成?