Rspec/capybara 请求无法查看页面内容

ele*_*nts 1 tdd rspec capybara ruby-on-rails-3

最终编辑: 感谢@PeterAlfvin 建议我专注于应用程序布局和标题,我能够修复它。我无法确切地弄清楚问题是什么,但标题中的某些内容导致水豚无法“看到”页面的其余部分。我删除了<%= render 'layouts/header' %>,重新构建了内部的标头application.html.erb,一旦它开始工作,将其拉出到部分并替换渲染语句。我摆弄了旧的和新的头文件来尝试找出问题,但还没有成功。这使得我的测试看起来有点脆弱,但如果问题再次出现,至少我会知道去哪里寻找。

编辑:如果您倾向于投反对票,请继续,但让我知道我忽略或未能研究的内容,因为您的评论可能会帮助我弄清楚这一点。

我已经搜索了几个小时试图解决这个问题,但我不知道发生了什么。我确信我错过了一些简单的东西,对于那些最后一天没有盯着它看的人来说,这些东西是显而易见的。无论如何,这就是我的希望。

我的所有 Rspec/capybara 请求规范都失败了,但是当我在浏览器中查看页面时,规范无法找到的所有元素都明显存在。据我所知,水豚没有看到整个页面 - save_and_open_page 返回一个几乎空白的页面。我在下面的规范中看到的失败是普遍的 - 规范可以看到页面标题,但看不到页面正文中的任何内容。我相当有信心我的所有路线都很好,因为所有标题测试都在应该通过的时候通过。

规格/请求/static_pages_spec.rb

require 'spec_helper'

describe "StaticPages" do

  subject { page }    

  describe "About page" do 
    before { visit about_path } 
    it { save_and_open_page; 
         should have_selector('title', text: 'Company Name | About') }    
    it { should have_selector('h1', text: 'About stuff') }
    it { should have_content('About paragraph') }
  end

  #more specs...

end
Run Code Online (Sandbox Code Playgroud)

结果:

5) StaticPages About page 
   Failure/Error: it { should have_selector('h1', text: 'About stuff') }
     expected css "h1" with text "About stuff" to return something
   # ./spec/requests/static_pages_spec.rb:28:in `block (3 levels) in <top (required)>'

6) StaticPages About page 
   Failure/Error: it { should have_content('About paragraph') }
     expected there to be content "About paragraph" in "Company Name | About\n\t\n\t\t"
   # ./spec/requests/static_pages_spec.rb:29:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

这是通过 save_and_open_page 在浏览器中打开的页面的“查看源代码”输出:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Company Name | About</title>
<link href="/assets/application.css" media="all" rel="stylesheet" type="text/css">
<script src="/assets/application.js" type="text/javascript"></script><!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>
<body>
<header class="navbar navbar-fixed-top navbar-inverse"><div class="navbar-inner">
    </div></header>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

因此,根据来源和规范 #6 的响应消息,看起来除了页面标题之外,它没有搜索任何内容,这一点得到了我的标题测试总是通过这一事实的支持,但没有其他内容。我有寻找表单元素、按钮等的测试,并且我尝试以不同的方式识别它们(标签、id、名称),但水豚找不到它们中的任何一个。同样,当我在浏览器中查看这些页面时,所有内容都清晰可见,并且标记正确。

当我在浏览器中访问“关于”页面时,这是正文的页面源,与上面显示的正文内容相反:

<body>
    <header class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
    <a class="brand" href='/'>Company Name</a>
    <ul class="nav pull-left">
        <li><a href="/products">Products</a></li>
        <li><a href="/about">About</a></li>
        <li><a href="/contact">Contact</a></li>
    </ul>
    <ul class="nav pull-right">
        <li><a href="/users/sign_in">Sign in</a></li>
    </ul>
</div>
    </header>
<div class="container-fluid">
    <div class="row-fluid">
        <div class="span10 offset2"></div>      
            <h1>About stuff</h1>
            <p>About paragraph</p>      
    </div>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)

宝石文件:

source 'https://rubygems.org'

gem 'rails', '3.2.13'
gem 'bootstrap-sass', '2.1'
gem 'faker', '1.1.2'
gem 'will_paginate', '3.0.4'
gem 'bootstrap-will_paginate', '0.0.9'
gem 'jquery-rails'
gem 'devise'
gem 'foreigner'
gem 'paper_trail'

group :development, :test do
  gem 'sqlite3', '1.3.7'
  gem 'rspec-rails', '2.11.0'
  gem 'letter_opener'
  gem 'factory_girl_rails', '4.1.0'
end

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '3.2.5'
  gem 'coffee-rails', '3.2.2'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '1.2.3'
end 

group :test do
  gem 'capybara', '1.1.2'
# gem 'rb-inotify', '0.8.8'
# gem 'libnotify, '0.5.9'
  gem 'shoulda-matchers'
  gem 'accept_values_for'
end

group :production do
  gem 'pg', '0.12.2'
end
Run Code Online (Sandbox Code Playgroud)

任何有助于解决这个问题的帮助将不胜感激。如果我应该提供任何其他信息,请告诉我。

编辑以添加 erb 文件

应用程序/视图/布局/application.html.erb

<!DOCTYPE html>
<html>
<head>
<title><%= full_title(yield(:title)) %></title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %> 
  <%= csrf_meta_tags %>
    <!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>
<body>

  <%= render 'layouts/header' %>  

  <div class="container-fluid">
    <div class="row-fluid">
      <div class="span10 offset2">

        <% flash.each do |key, value| %>
          <div class="alert alert-<%= key %>"><%= value%></div>
        <% end %>

      </div>  

    <%= yield %>

    <%= render 'layouts/footer' %>
    <%= debug(params) if Rails.env.development? %>    

    </div>
  </div>   
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

应用程序/视图/布局/_header.html.erb

<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <a class="brand" href='/'>Company Name</a>
      <ul class="nav pull-left">
        <li><%= link_to "Products", products_path %></li>
        <li><%= link_to "About",    about_path    %></li>
        <li><%= link_to "Contact",  contact_path  %></li>
      </ul> 

    <% if user_signed_in? %>
      <ul class="nav pull-right"> 
        <li><strong><%= current_user.email %></strong></li>
        <li><%= link_to 'Account', account_path %></li>
        <li><%= link_to "Sign out", destroy_user_session_path, method: :delete %></li>
      </ul> 
    <% else %>
      <ul class="nav pull-right">
        <li><%= link_to "Sign in", new_user_session_path %></li>
      </ul>
    <% end %>
  </div>
</header>
Run Code Online (Sandbox Code Playgroud)

应用程序/视图/布局/_footer.html.erb

<footer class="footer">
  <small>Company Name Price Management</small>
</footer>
Run Code Online (Sandbox Code Playgroud)

应用程序/视图/static_pages/about.html.erb

<% provide(:title, 'About') %>
<h1>About stuff</h1>
<p>About paragraph</p>
Run Code Online (Sandbox Code Playgroud)

ele*_*nts 5

今天(一个多月后)我意识到是什么导致了这个问题——一个不正确的 HTML 注释。当我做实验时,我通常会注释掉实验而不是删除它们,所以它肯定会再次发生,但这一次更容易被发现。

正确评论:
<!-- commented-out HTML -->

错误评论:
<!-- commented-out HTML --!>

错误评论结束时的那一秒!导致评论无法正确关闭。我的文本编辑器并不关心,我的浏览器似乎渲染的一切都是一样的,但就我而言,水豚没有读过去。

有点尴尬,但至少我现在知道了。