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

时间:2018-01-13 00:22:32

标签: rspec capybara

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

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

1 个答案:

答案 0 :(得分:1)

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