1

当它们都应该成功时,我有 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>

以及“内容”和“关于”的完全相同的错误

应用程序.html.erb

<!DOCTYPE html>
<html>
<head>
    <title><%= title %></title>
    <%= csrf_meta_tag %>
</head>
<body>
    <%= yield %>
</body>
</html>

主页.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
4

2 回答 2

6

如果您使用 Capybara ,则会忽略像元素2.0这样的不可见文本。在此处title查看有关它的 Capybara Github 问题。

Rails 教程专门使用 Capybara 版本1.1.2,因此如果您还没有这样做,请确保按照教程 Gemfile为所有 gem 编写显式版本。

如果您想在现在或将来使用 Capybara 2.0,请参阅以下 SO 问题以获取帮助设置它,以及让该title元素再次工作的测试:

于 2013-01-14T22:41:58.663 回答
2

在 Capybara 2.x 中,为了查找/与不可见文本交互,您可以传递 ":visible => false"。

例子:

page.should have_selector("head title", text: "my title", visible: false)

这适用于所有内容,而不仅仅是标题。所以虽然是的,有一个 has_title() 匹配器专门用于标题,如果您需要以其他方式与页面的隐藏内容交互,请使用 ":visible => 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 => false" 传递给失败的规范可能有助于你的构建绿色。

ps 如果您使用的是 Ruby 1.9+,则上述哈希语法有效。如果你还在 1.8+,使用 ":visible => false"、":with => 'foo'" 等。

于 2013-12-09T12:32:03.560 回答