我有3个rspec选择器失败时,他们都应该成功。我跟随rails-tutorial.org书和他的节目一样正确。
PagesController GET 'home' should have the right title
Failure/Error: response.should have_selector("title", :content => "Ruby on Rails Sample App | Home")
expected following output to contain a <title>Ruby on Rails Sample App | Home</title> tag:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Ruby on Rails Tutorial Sample App | Home</title>
</head>
与'content'和'about'完全相同的错误
application.html.erb
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
home.html.erb
<h1>Sample App</h1>
<p>
This is the home page for the <a href='http://railstutorial.org'>Ruby on Rails Tutorial</a> sample application
</p>
application_helper.erb
module ApplicationHelper
#Return a title on a per-page basis
def title
base_title = "Ruby on Rails Tutorial Sample App"
if @title.nil?
base_title
else
"#{base_title} | #{@title}"
end
end
end
pages_controller_spec.rb
require 'spec_helper'
describe PagesController do
render_views
describe "GET 'home'" do
it "should be successful" do
get 'home'
response.should be_success
end
it "should have the right title" do
get 'home'
response.should have_selector("title", :content => "Ruby on Rails Sample App | Home")
end
it "should have a non-blank body" do
get 'home'
response.body.should_not =~ /<body>\s*<\/body>/
end
end
答案 0 :(得分:6)
如果您使用Capybara 2.0
,则会忽略title
元素之类的隐藏文字。请参阅Capybara Github有关它的问题here。
Rails教程专门使用Capybara版本1.1.2
,因此如果您还没有这样做,请确保按照the tutorial Gemfile为所有宝石编写显式版本。
如果您想现在或将来使用Capybara 2.0,请参阅以下SO问题以获得帮助进行设置,以及让title
元素再次运行测试:
答案 1 :(得分:2)
使用Capybara 2.x,为了查找/隐藏不可见文本,您可以传递“:visible =&gt; false”。
示例:
page.should have_selector("head title", text: "my title", visible: false)
这适用于所有内容,而不仅仅是标题。所以虽然是的,但是有一个专门用于标题的has_title()匹配器,如果你需要以其他方式与页面的隐藏内容进行交互,请使用“:visible =&gt; false”。
page.should have_selector("link href='style.css'", visible: false)
这也适用于capybara命令,如fill_in(),click_button()等。
click_button("hidden_button_name", visible: false)
fill_in("hidden_field_name", with: "foo", visible: false)
使用Capybara 2.2.0和Rspec-Rails 2.14.0确认。
与隐藏元素交互可能表明您的规范所做的事情超出了应有的范围,但这是一个单独的问题。如果您在升级Capybara后发现您的规格正在破坏,则将“:visible =&gt; false”传递给失败的规范可能有助于使您的构建变为绿色。
P.S。如果您使用Ruby 1.9+,则以上哈希语法有效。如果您仍然使用1.8+,请使用“:visible =&gt; false”,“:with =&gt;'foo'”等。