Ruby on Rails - CRUD com TDD

Origem: https://udemy.com/course/rails-tdd/

00. Ideias:

01. Iniciando o projeto Rails e instalando RSpec

# criar um novo app usando rails versão 5.1.4
# -T para começar sem os testes (usaremos RSpec)
#rails _5.1.4_ new rails-crud -T

# na verdade usei o rails mais atual mesmo
rails new rails-crud -T
cd rails-crud

Gemfile:

group :development, :test do
  # ...
  gem 'rspec'
  gem 'rspec-rails'
end
# instalar 'rspec-rails' que adicionamos ao Gemfile
bundle install

# create the commands in bin/ dir
bundle binstubs --all

# install rspec in the project
rails generate rspec:install

.rspec

--format documentation
# criar o banco de dados
rails db:create:all

config/application.rb:

module RailsCrud
  class Application < Rails::Application
    config.generators do |g|
      g.test_framework(
        :rspec,
        fixtures: false,
        view_specs: false,
        helper_specs: false,
        routing_specs: false
      )
    end
  end
end

02. Feature Spec

Só uma explicação de como funciona o método de TDD:

Aplicando TDD! Primeiro escrever os testes e depois escrever o código de produção!

rails generate rspec:feature welcome

spec/features/welcome_spec.rb:

require 'rails_helper'

feature 'Welcome', type: :feature do

  scenario 'Show Welcome message' do
    visit(root_path)
    expect(page).to have_content('Welcome to my app!')
  end

end

Rodar o teste e observar que ocorrerá um erro dizendo que não tem rota!

Vamos criar a rota:

config/routes.rb:

root to: 'welcome#index'

Criar o controller com o método index e também o view com o index.html.erb...

Rodar o teste.

spec/features/welcome_spec.rb:

scenario 'Check Show Customers link' do
  visit(root_path)
  expect(find('ul li')).to have_link('Show Customers')
end

Rodar o teste e ver que vai falhar

Criar o link para "Show Customers" na view.

Rodar os testes.

04. Feature Customer

rails generate rspec:feature customer

spec/features/customers_spec.rb:

feature 'Customers', type: :feature do
  scenario 'Check New Customer link' do
    visit(root_path)
    expect(page).to have_link('Show Customers')
  end

  scenario 'Validate New Customer link' do
    visit(root_path)
    click_on('Show Customers')
    expect(page).to have_content('Customers List')
    expect(page).to have_link('New Customer')
  end
end

Vamos gerar o controller:

rails generate controller customers

config/routes.rb:

resources :customers

spec/features/customers_spec.rb:

feature 'Customers', type: :feature do
  # ...
  scenario 'Check New Customer form' do
    visit(customers_path)
    click_on('New Customer')
    expect(page).to have_content('New Customer')
  end
end

Criar a view new.html.erb

05. Formulário de novo cliente

Instalar a faker gem no grupo de desenvolvimento/teste (Gemfile).

teste:

scenario 'create a new customer' do
  visit(new_customer_path)
  customer_name = Faker::Name.name 
  fill_in('Name', with: customer_name )
  fill_in('Email', with: Faker::Name.name)
  fill_in('Telephone', with: Faker::Name.name)
  attach_file('Avatar', "#{Rails.root}/spec/fixtures/avatar.png")
  choose(optin: ['Y', 'N'].sample)
  click_on('Create Customer')

  expect(page).to have_content('New Customer successfully created')
  expect(Customer.last.name).to eq(customer_name)
end

Criando o model

rails generate model Customer name email phone avatar smoker

# check the migration file

rails db:migrate

Legal aqui o lance de internacionalização (aka i18n): aula, aos 7min