Программа урока
- Автоматизация стилистики кода с помощью Rubocop
- Повышение безопасности приложения с Brakeman
- Создание интеграционных тестов
- Удобный сетап тестов фикстурами
- Изолируем тест: паттерн "Транзакционные тесты"
- Дебаг кода с помощью binding.irb
Полезные команды
# Генерация нового проекта
rails new rails-quality
# Установка новых зависимостей после добавления их в Gemfile
bundle install
# Запуск линтера
bundle exec rubocop
# safe auto correction Автокорректирование стилистики
bundle exec rubocop -a
# При флаге -A может измениться бизнес логика
bundle exec rubocop -A
# Генерация контроллера с экшенами
rails g controller notes index show
# Генерация модели с атрибутами
rails g model Note title:string description:text
# Выполнение миграции
rails db:migrate
# Запуск сервера
rails s
# Заполнение базы фикстурами
rails db:fixtures load
rails c
# в консоли
# Note.delete_all
bundle exec brakeman
# Генерация тестов
rails g integration_test notes_flow
# Запуск тестов
bin/rails test:integration
Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
group :development, :test do
# Гем для отладки. Вызов debugger() приводит к остановке и вызову binding.irb
gem 'byebug', platforms: %i[mri mingw x64_mingw]
end
group :development do
# Гем для статического анализа и безопасности приложения
gem 'brakeman'
end
# Rubocop - линтер и статический анализатор
gem 'rubocop', require: false
gem 'rubocop-rails', require: false
notes_controller.rb
class NotesController < ApplicationController
def index
@notes = Note.all.order(created_at: :desc)
end
def show
# debugger
@note = Note.find(params[:id])
end
end
index.html.erb
<h1>Notes</h1>
<% @notes.each do |note| %>
<h4><%= link_to note.title, note_path(note) %></h4>
<p><%= note.description %></p>
<% end %>
show.html.erb
<h1>Note page</h1>
<h4><%= @note.title %></h4>
<p><%= @note.description %></p>
<%= link_to "Back", notes_path %>
routes.rb
Rails.application.routes.draw do
root 'notes#index'
# get 'notes', to: 'notes#index'
# get 'notes/show'
resources :notes, only: [:index, :show]
end
notes_flow_test.rb
require "test_helper"
class NotesFlowTest < ActionDispatch::IntegrationTest
# Rails автоматически используют транзакционные тесты
# self.use_transactional_tests = false
test 'opens all notes page' do
get root_url
assert_response :success
assert_select 'h1', 'Notes'
end
test 'opens one note page' do
note = Note.create(title: "Title 1", description: "Description 1")
# debugger
get note_url(note.id)
assert_response :success
assert_select 'h1', 'Note page'
assert_select 'h4', 'Title 1'
assert_select 'p', 'Description 1'
end
test 'opens one note page with fixture' do
note = notes(:one)
get note_url(note)
assert_response :success
assert_select 'h1', 'Note page'
assert_select 'h4', 'Title 1'
assert_select 'p', 'Description 1'
end
end
Фикстуры
# при загрузке фикстур создается хелпер, с помощью которого можно получить модели
# В тестах
notes_list = notes()
# Можно получить объект из фикстур по ключу в yaml файле фикстуры
note = notes(:one)

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.