use*_*003 2 rspec ruby-on-rails capybara
像许多人一样,我使用Capybara不仅测试功能规格,还使用我的Rails View规范中的渲染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
Run Code Online (Sandbox Code Playgroud)
但是,我最近注意到几个测试(与上面类似的格式)在它们实际上应该失败时传递(误报).
我将其跟踪到within do ... end块的行为- 它从不在我的视图规范中执行那些块.我证实了试图用暂停执行binding.pry内部within块,但它永远不会触发.由于它从未执行过,所有规格都很愉快地传递
它看起来像是within一个Capybara会话方法,因为没有"会话",所以它不适合用于视图规范.
我很好奇为什么呼叫within只是默默地失败了?within它调用了什么方法,如果没有找到它,为什么不抛出错误?
有没有办法让它与视图规格一起工作?使用复杂的呈现HTML,将测试范围限定在特定的HTML节点上是非常方便的,这是最重要的within,所以我很乐意能够使用它
谢谢!
默认情况下,只有Capybara :: RSpecMatchers应该包含在视图规范中 - https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L10 - 而不是Capybara :: DSL,所以Capybaras不within应该不可用(尝试使用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")
Run Code Online (Sandbox Code Playgroud)
更新:快速浏览之后,within你实际上调用的可能是RSpec be_within匹配器,由于某种原因它被别名为within- https://github.com/rspec/rspec-expectations/blob/3-5-maintenance/ lib/rspec/matchers.rb#L416 - 不知道为什么,因为我无法想到在期望中如何读得好 - 基本上你的所有声明都在做的是创建一个永远不会调用的匹配器而只是忽略块传递给它.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |