我试图将一些代码提取到自定义匹配器中:
matcher :have_nav_headers do |headers|
match_unless_raises do |page|
headers.each do |header|
expect(find('.navbar-default')).to have_content(header)
end
end
end
matcher :have_nav_headers do |headers|
match_unless_raises do |page|
within('.navbar-default') do
byebug
headers.each do |header|
expect(page).to have_content(header)
end
end
end
end
第一个匹配器将执行得很好,但如果我尝试使用第二个版本,我将永远不会打到调试,测试将自动通过。除了使用'within'之外,我看不出两者之间有什么区别,对于我正在编写的其他一些自定义匹配器,我更愿意能够使用它。
答案 0 :(得分:1)
RSpec提供be_within
匹配器,其别名为within
。不幸的是,如果使用块调用它不会引发错误,并且因为调用它只是创建一个匹配器(但从不评估它),它实际上并没有对它传递的内容做任何事情。 。最近的版本Capybara安装了一个代理,尝试根据传递的参数尝试路由到within
的正确版本,因此要么更新到当前版本的Capybara,要么尝试调用within_element
(而不是within
)这是Capybara提供的within
版本的别名。您还应该能够在page
上调用它以确保调用正确的版本(page.within ...
)