Опубликован: 27.01.2016 | Уровень: для всех | Доступ: платный
Лекция 5:

Заполнение шаблона

Заключение

В этой главе мы привели шаблон нашего приложение в чувство и отполировали маршруты. Остальная часть книги посвящена конкретизации примера приложения: во-первых, путем добавления пользователей, которые могут зарегистрироваться, войти в систему и выйти; затем добавлением пользовательских микросообщений и, наконец, добавлением возможности следить за микросообщениями других пользователей.

Если вы используете Git, вам следует объединить изменения с мастер-веткой:

$ git add .
$ git commit -m "Finish layout and routes"
$ git checkout master
$ git merge filling-in-layout

Также вы можете отправить изменения на GitHub:

$ git push

Наконец, вы можете развернуть приложение на Heroku:

$ git push heroku

Результатом должно стать работающий пример приложения на продакшен сервере:

$ heroku open

Если столкнулись с проблемами, попробуйте выполнить

$ heroku logs

чтобы узнать об ошибках с помощью логов Heroku.

Упражнения

  1. Мы видели в Разделе 5.3 что Rspec-матчер have_content иногда работает слишком общО что приводит нас к временному закомментированию строки "Contact" в футере во избежание ошибочно-проходящего теста (Листинг 5.18). Для того чтобы исправить это Листинг 5.38 вводит предоставляемый Capybara метод have_selector который позволяет нам тестировать наличие отдельных HTML тегов. Удаляя и возвращая на место "Contact" h1 в Листинге 5.21, убедитесь что код в Листинге 5.38 выдает провальный тест даже если подвал не закомментирован.
  2. Код для тестирования статических страниц в Листинге 5.30 компактен, но по прежнему имеет повторения. RSpec поддерживает возможность называемую shared examples предназначенную для устранения такого вида дублирования. Следуя примеру в Листинге 5.39, заполните пропущенные тесты для страниц Help, About и Contact. Обратите внимание - команда let кратко обсуждаемая в Листинге 3.31, создает локальную переменную с данным значением по запросу (т.е. при использовании переменной), в отличие от переменной экземпляра, которая создается в момент назначения. (Листинг 5.39 также использует have_selector из Листинга 5.38.)
  3. Возможно вы заметили что наши тесты для ссылок шаблона тестируют маршруты, но на самом деле не проверяют, ведут ли ссылки к правильным страницам. Один из способов реализации этих испытаний заключается в использовании visit и click_link внутри RSpec интеграционного теста. Дополните код из Листинга 5.40 чтобы проверить что все ссылки шаблона правильно определены.
  4. Устраните необходимость в тестовом хелпере full_title в Листинге 5.29 написав тест для оригинального вспомогательного метода, как это показано в Листинге 5.41. (Вам необходимо будет создать директорию spec/helpers и файл application_helper_spec.rb.) Затем include его в тест с помощью кода в Листинге 5.42. Проверьте, запустив тесты, что новый код работает. Примечание: Листинг 5.41 использует регулярные выражения о которых мы узнаем больше в Разделе 6.2.4. (Спасибо Alex Chaffee за совет и код используемый в этом упражнении.)
require 'spec_helper'

describe "Static pages" do
  .
  .
  .
  describe "Contact page" do
    before { visit contact_path }

    it { should have_selector('h1', text: 'Contact') }
    it { should have_title(full_title('Contact')) }
  end
end
Листинг 5.38. Более основательный тест для страницы Contact. spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do

  subject { page }

  shared_examples_for "all static pages" do
    it { should have_selector('h1', text: heading) }
    it { should have_title(full_title(page_title)) }
  end

  describe "Home page" do
    before { visit root_path }
    let(:heading)    { 'Sample App' }
    let(:page_title) { '' }

    it_should_behave_like "all static pages"
    it { should_not have_title('| Home') }
  end

  describe "Help page" do
    .
    .
    .
  end

  describe "About page" do
    .
    .
    .
  end

  describe "Contact page" do
    .
    .
    .
  end
end
Листинг 5.39. Применение RSpec shared example для устранения дублирования в тестах. spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do
  .
  .
  .
  it "should have the right links on the layout" do
    visit root_path
    click_link "About"
    expect(page).to have_title(full_title('About Us'))
    click_link "Help"
    expect(page).to # заполнить
    click_link "Contact"
    expect(page).to # заполнить
    click_link "Home"
    click_link "Sign up now!"
    expect(page).to # заполнить
    click_link "sample app"
    expect(page).to # заполнить
  end
end
Листинг 5.40. Тест для ссылок в шаблоне. spec/requests/static_pages_spec.rb
require 'spec_helper'

describe ApplicationHelper do

  describe "full_title" do
    it "should include the page title" do
      expect(full_title("foo")).to match(/foo/)
    end

    it "should include the base title" do
      expect(full_title("foo")).to match(/^Ruby on Rails Tutorial Sample App/)
    end

    it "should not include a bar for the home page" do
      expect(full_title("")).not_to match(/\|/)
    end
  end
end
Листинг 5.41. Тесты для хелпера full_title из application_helper.rb. spec/helpers/application_helper_spec.rb
include ApplicationHelper
Листинг 5.42. Замена тестового хелпера full_title на простой include. spec/support/utilities.rb
Вадим Обозин
Вадим Обозин

Здравствуйте, записался на курс. При этом ставил галочку на "обучаться с тьютором". На email пришло письмо, о том, что записался на самостоятельное изучение курса. Как выбрать тьютора?

Акбар Ахвердов
Акбар Ахвердов
Россия, г. Москва
Артём Зайцев
Артём Зайцев
Украина, ДНР