在这一个上抓了几个小时,最后需要放弃并问。至少我在此期间对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
我开始怀疑某处版本不兼容。
答案 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