Ruby on rails 使用水豚';Rails视图规范中的s`in`scoping helper

Ruby on rails 使用水豚';Rails视图规范中的s`in`scoping helper,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,和许多人一样,我使用Capybara不仅测试功能规范,还测试Rails视图规范中呈现的HTML 我将呈现的HTML包装到一个Capybara节点中- require "spec_helper" RSpec.describe "foo/show.html.erb", type: :view do it "should display foo" do render within(".some-class") do expect(page).to have_cont

和许多人一样,我使用Capybara不仅测试功能规范,还测试Rails视图规范中呈现的HTML

我将呈现的HTML包装到一个Capybara节点中-

require "spec_helper"

RSpec.describe "foo/show.html.erb", type: :view do
  it "should display foo" do
    render

    within(".some-class") do
      expect(page).to have_content("woohoo")
    end
  end

  def page
    @page ||= Capybara::Node::Simple.new(rendered)
  end
end
然而,我最近注意到一些测试(类似于上面的格式)在实际失败(假阳性)时通过了

我追踪到了do中
的行为。。。结束
block-它从不执行我的视图规范中的那些块。我通过尝试暂停执行
binding.pry
块内的
来确认,但它从未触发。由于它从未执行过,所有的规范都很顺利地通过了

看起来
中的
是一个,它不打算与视图规范一起工作,因为没有“会话”,这是有道理的

  • 我很好奇,为什么对
  • 中的
    的调用会悄无声息地失败?它在调用
    方法中的
    ,如果找不到,为什么不抛出错误

  • 有没有办法让它在这里与视图规格一起工作?使用复杂的呈现HTML,将测试范围限定到特定的HTML节点非常方便,这是
  • 中的
    的全部要点,因此我希望能够使用它


    谢谢

    默认情况下,视图规范中只应包含Capybara::RSpecMatchers,而不是Capybara::DSL,因此
    中的Capybara
    不应可用(尝试使用byebug并进入内部调用以查看提供它的库)。您可以通过使用匹配器/查找器可以在节点上被调用的事实来确定测试的范围,并将范围限定到所使用的节点,例如

    page = Capybara.string(rendered)
    scoped_node = page.find(".some-class")
    expect(scoped_node).to have_content("woohoo")
    expect(scoped_node.find('.contained-class')).to have_content("abcdefg")
    

    更新:快速浏览之后,您实际调用的
    中的
    可能是matcher中的RSpec be_,出于某种原因,它在中被别名为——我不知道为什么,因为我想不出这在预期中是如何读取的——基本上,您的语句所做的就是创建一个从未调用过的matcher,而只是忽略该块转交给它。

    谢谢汤姆!这现在是有道理的,并且可以直接解释这种行为。出于好奇,为什么不在视图规范中包含
    Capybara::DSL
    ?该库是否驱动实际的web浏览器,因此不适用于仅呈现纯HTML的视图规范?羞耻,因为()中的
    是一个非常有用的助手,读起来非常好@user2490003正确-Capybara::DSL包含驱动浏览器的会话方法,这在视图规范中没有意义。如果需要,您应该能够在方法中为视图规范编写自己的
    ,只需将当前
    页面
    上的
    find
    (带有传递的参数)的结果推送到堆栈上,然后将
    页面
    定义为堆栈顶部或
    Capybara.string(呈现)
    如果当前没有定义完美的页面,那就更好了。再次感谢。