match_unless_raises 和自定义匹配器中未执行的块内

Within block not executed inside match_unless_raises and custom matcher

我试图将我的一些代码提取到自定义匹配器中:

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' 之外,我看不出两者之间有任何区别,对于我正在编写的其他一些自定义匹配器,我真的更希望能够使用它。

RSpec 提供了一个 be_within 匹配器,它别名为 within。不幸的是,如果用块调用它不会引发错误,并且由于调用它只是创建一个匹配器(但从不评估它)它实际上也不会对它传递的内容做任何事情。最近的版本 Capybara 安装了一个代理来尝试根据传递的参数路由到 within 的正确版本,因此要么更新到 Capybara 的当前版本,要么尝试调用 within_element(而不是 within ) 这是 Capybara 提供的 within 版本的别名。您还应该能够在 page 上调用它以确保调用正确的版本 (page.within ...)