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') }
有一些文章(例如[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') }