Учебное пособие по Rail3 (глава 5): ошибка click_link - PullRequest
1 голос
/ 15 июля 2011

Крест размещен на: http://www.ruby -forum.com / topic / 2140862 # new

Вот ошибка, которую я получаю:

.....F

Failures:
  1) LayoutLinks should have the right links on the layout
     Failure/Error: click_link "Sign up"
     Could not find link with text or title or id "Sign up"
     # ./spec/requests/layout_links_spec.rb:37:in `block (2 levels) in
     <top (required)>'

Finished in 0.28358 seconds
6 examples, 1 failure

Вот тестовый файл для LayoutLinks. Последний «блок» имеет click_link, который вызывает у меня проблему:

# спецификации / запросы / layout_links_spec.rb:

require 'spec_helper'

describe "LayoutLinks" do
  it "should have a Home page at: /" do
    get '/'
    response.should have_selector('title', :content => "Home")
  end

  it "should have an About page at: /about" do
    get '/about'
    response.should have_selector('title', :content => "About")
  end

  it "should have a Contact page at: /contact" do
    get '/contact'
    response.should have_selector('title', :content => "Contact")
  end

  it "should have a Help page at: /help" do
    get '/help'
    response.should have_selector('title', :content => "Help")
  end

  it "should have a Sign up page at: /signup" do
    get "/signup"
    response.should have_selector('title', :content => "Sign up")
  end

  it "should have the right links on the layout" do
    visit root_path
    click_link "About"
    response.should have_selector('title', :content => "About")
    click_link "Contact"
    response.should have_selector('title', :content => "Contact")
    click_link "Help"
    response.should have_selector('title', :content => "Help")
    click_link "Sign up"
    response.should have_selector('title', :content => "Sign up")
    click_link "Home"
    response.should have_selector('title', :content => "Home")
  end

Остальные тесты click_link пройдены. Это только ссылка «Зарегистрироваться» это дает мне проблему. Единственное отличие, которое я могу различить, это что страница со ссылкой «Зарегистрироваться» обрабатывается другим controller: Users # new v. Pages (контроллеры ниже).

Вот мои маршруты:

конфиг / routes.rb:

SampleApp::Application.routes.draw do
  get "users/new"

  match '/signup', :to => 'users#new'

  match '/about', :to => 'pages#about'
  match '/contact', :to => 'pages#contact'
  match '/help', :to => 'pages#help'

  root :to => 'pages#home'
end

Вот макет приложения:

приложение / просмотров / макеты / application.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <title><%= title() %></title>
    <%= csrf_meta_tag %>
    <%= render 'layouts/stylesheets' %>
  </head>

  <body>

    <div class="container">

      <%= render 'layouts/header' %>

      <section class="round">
        <%= yield %>
      </section>

      <%= render 'layouts/footer' %>

    </div>

  </body>
</html>

Вот домашняя страница, которая содержит ссылку «Зарегистрироваться», которая вставляется в поле «yield» в макете приложения выше:

приложение / просмотров / страниц / home.html.erb:

<h1>Me</h1>
<p>Hi, this is my website.</p>

<%= link_to "Sign up", signup_path, :class => "signup_button round" %>

Вот мои контроллеры:

приложение / контроллеры / users_controller.rb:

class UsersController < ApplicationController
  def new
    @title = "Sign up"
  end

end

приложение / контроллеры / pages_controller.rb:

class PagesController < ApplicationController
  def home
    @title = "Home"
  end

  def contact
    @title = "Contact"
  end

  def about
    @title = "About"
  end

  def help
    @title = "Help"
  end


end

Когда я вручную нажимаю ссылку «Зарегистрироваться» на домашней странице, она успешно отображает страницу:

приложение / просмотров / пользователей / new.html.erb

<h1>Users#new</h1>
<p>Find me in app/views/users/new.html.erb</p>

И если я нажму на View Source для домашней страницы, там будет ссылка «Sign up» (не путать со ссылкой «Sign in»):

<!DOCTYPE html>
<html>
  <head>
    <title>My website | Home</title>
    <meta name="csrf-param" content="authenticity_token"/>
<meta name="csrf-token" content="i/PD5uKjp87ArBPcr51a82KeW/5peacAJ6M908f3sP8="/>
    <!--[if lt IE 9]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

<link href="/stylesheets/blueprint/screen.css?1310454155" media="screen" rel="stylesheet" type="text/css" />
<link href="/stylesheets/blueprint/print.css?1310454155" media="print" rel="stylesheet" type="text/css" />

<!--[if lt IE 8]>
  <link href="/stylesheets/blueprint/ie.css?1310454155" media="screen" rel="stylesheet" type="text/css" />
<![endif]-->

<link href="/stylesheets/custom.css?1310632912" media="screen" rel="stylesheet" type="text/css" />

  </head>

  <body>

    <div class="container">

      <header>
  <a href="/"><img alt="Autumn" class="round" height="140" src="/images/autumn.jpg?1310626333" width="300" /></a>

  <nav class="round">
    <ul>
      <li><a href="/">Home</a></li>
      <li><a href="/help">Help</a></li>
      <li><a href="#">Sign in</a></li>
    </ul>
  </nav>

</header>


      <section class="round">
        <h1>Me</h1>
<p>Hi, this is my website.</p>

<a href="/signup" class="signup_button round">Sign up</a>



      </section>

      <footer>
  <nav class="round">
    <ul>
      <li><a href="/about">About</a></li>
      <li><a href="/contact">Contact</a></li>
      <li><a href="http://news.railstutorial.org/">News</a></li>
    </ul>
  </nav>
</footer>



    </div>

  </body>
</html>

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

click_link фактически изменяет страницу, которую проверяет тест, то есть «посещение root_path» больше не является текущей страницей после того, как вы сделали click_link.Моя ссылка «Зарегистрироваться» отображается только на домашней странице, а остальные ссылки - на каждой странице.Следовательно, переход от домашней страницы к серверу с просьбой нажать ссылку «Зарегистрироваться» не сработал.

Решение заключается в следующем:

click_link "Sign up"
response.should have_selector('title', :content => "Sign up")

вправопосле:

visit root_path

или после:

click_link "Home"
response.should have_selector('title', :content => "Home")
0 голосов
/ 20 марта 2014

Порядок ваших тестов при использовании большого количества тестов click_link важен.Как указал 7stud, click_link имитирует фактическое нажатие на ссылку и переход туда, куда указывает ссылка.

Убедитесь, что ссылка, которую вы тестируете, существует на странице, на которой вы находитесь, в противном случае вы получите ошибку.

Вы можете сделать то, что предложил другой ответ, или

visit root_path

, а затем

click_link "Sign up"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...