当预期输出正确时,Rspec has_selector错误

时间:2013-01-12 06:21:09

标签: ruby-on-rails capybara rspec-rails railstutorial.org

我有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

2 个答案:

答案 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'”等。