Ruby on rails 使用水豚';Rails视图规范中的s`in`scoping helper
和许多人一样,我使用Capybara不仅测试功能规范,还测试Rails视图规范中呈现的HTML 我将呈现的HTML包装到一个Capybara节点中-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
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(呈现)
如果当前没有定义完美的页面,那就更好了。再次感谢。