RSpec和Capybara匹配失败

时间:2014-11-19 04:03:53

标签: ruby-on-rails rspec capybara

在这一个上抓了几个小时,最后需要放弃并问。至少我在此期间对RSpec和Capybara有了更多的了解,但显然还不够。

subject { page }

describe "Help page" do
  before { visit help_path }
  it { should have_valid_header_and_title('Help', 'Help') }
end

失败
expected #<Capybara::Session> to have valid header and title "Help" and "Help" ./spec/features/static_pages_spec.rb:18:in `block (3 levels) in <top (required)>'
-e:1:in `load'
-e:1:in `<main>'

我有一个for_valid_header_and_title的匹配器:

RSpec::Matchers.define :have_valid_header_and_title do |heading, page_title|
  match do |page|
    if (heading) then
      expect(page.body).to have_selector('h1', text: heading)
    end
    expect(page.body).to have_selector('title', text: full_title(page_title))
  end
end

full_title的辅助函数:

def full_title(page_title)
  base_title = "Homewatch"
  if page_title.empty?
    base_title
  else
    "#{base_title} | #{page_title}"
  end
end

最后,这就是page.body由(使用插入调试的插件)组成的:

"<!DOCTYPE html>\n<html>\n<head>\n  <title>Homewatch | Help</title>...

调试,我看到full_title返回“Homewatch | Help”,它应该与title元素匹配,并且有一个带有“Help”的h1元素。所以它应该通过!<​​/ p>

我已经尝试过page.should和page.body.should而不是expect(page.body).to,我试过has_selector?它只是给出一个未定义的名称错误,以及其他各种事情。

使用rails 3.2.18,rspec-rails 3.1.0,capybara 2.4.4和capybara-webkit 1.3.1

我开始怀疑某处版本不兼容。

1 个答案:

答案 0 :(得分:0)

想出来。这是logged issue的结果。

问题是某些Web驱动程序找不到title元素(它被认为是不可见的)。通过添加一个visible:切换到have_selector和has_selector,可以在Capybara中修复此问题。我改变了我的匹配器:

RSpec::Matchers.define :have_valid_header_and_title do |heading, page_title|
  match do |page|
    if (heading) then
      expect(page.body).to have_selector('h1', text: heading)
    end
    Capybara.string(page.body).has_selector?('title', text: full_title(page_title), visible: false)
  end
end