
Esta Live aconteceu no dia 17/05/2017 às 20h30 e foi a Parte 2 de uma conversa muito bacana sobre a Importância dos Testes no mundo do Ruby on Rails.
Veja a Parte 1 clicando aqui.
Então vamos lá, o que foi falado na Live:
Testes na Prática
1 – Criando o Projeto:
1 |
rails new testing |
2 – Coloque no seu Gemfile:
***** No vídeo eu coloco por engano a gem factory_girl, mas o correto é factory_girl_rails ******
1 2 3 4 5 6 7 8 9 10 11 12 |
gem 'materialize-sass' gem 'material_icons' group :test do gem "factory_girl_rails", "~> 4.0" gem "ffaker" end group :development, :test do gem 'rspec-rails', '~> 3.5' gem 'byebug', platform: :mri end |
3 – Instale rodando:
1 |
bundle install |
4 – Altere o app/assets/stylesheets/application.css para app/assets/stylesheets/application.scss e coloque nele:
1 2 3 |
@import "materialize"; @import "material_icons"; @import "task" |
5 – Coloque no app/assets/javascripts/application.js:
1 2 3 4 5 |
//= require jquery //= require jquery_ujs //= require turbolinks //= require materialize-sprockets //= require_tree . |
6 – Instale o Rspec:
1 |
rails generate rspec:install |
7 – Crie uma pasta chamada support dentro da pasta spec
8 – Agora crie um arquivo chamado factory_girl.rb e coloque nele:
1 2 3 |
RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods end |
9 – Coloque no spec/rails_helper.rb:
1 |
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } |
10 – Crie uma pasta chamada factories dentro da pasta spec
11 – Gere o nosso controller principal:
1 |
rails g controller Task index create done --skip-template-engine |
12 – Coloque no Routes:
1 2 3 4 5 6 |
Rails.application.routes.draw do root to: 'task#index' get 'task/index' put 'task/done/:id' => 'task#done', :as => 'done_task' post 'task/create' => 'task#create' end |
13 – Gere o nosso Model Task rodando:
1 |
rails g model tasks description:text status:integer |
14 – Coloque no model Task:
1 2 3 4 5 6 7 8 |
class Task < ApplicationRecord enum status: [ :done, :todo ] validates_presence_of :description, :status def done self.update(status: :done) end end |
15 – Crie o banco de dados e as migrations rodando:
1 |
rake db:create && rake db:migrate |
16 – Coloque esse conteúdo no Controller Task:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class TaskController < ApplicationController before_action :set_task, only: [:done] def index @tasks = Task.where(status: :todo) @tasks_done = Task.where(status: :done) end def create @task = Task.new(description: params[:description], status: :todo) if @task.save redirect_to({ action: 'index' }, notice: "Task was successfully created.") else redirect_to({ action: 'index' }, notice: "Task was not created.") end end def done if @task.done redirect_to({ action: 'index' }, notice: "Task is done.") else redirect_to({ action: 'index' }, notice: "Problem in put task done.") end end private def set_task @task = Task.find(params[:id]) end end |
17 – Crie uma pasta chamada task em views e dentro um arquivo chamado index.html.erb e coloque nele:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<div class="container"> <h4 class="header">New Task</h4> <div class="row"> <form class="col s12"> <div class="row"> <div class="input-field col s12"> <input id="description" type="text" class="validate"> <label for="description">Task Description</label> </div> </div> <div class="row"> <div class="col s3 right"> <button class="btn waves-effect waves-light right" type="submit" name="action">Create <i class="material-icons right">send</i> </button> </div> </div> </form> </div> <% if @tasks.present? %> <h4 class="header">What I have to do?</h4> <ul class="collection"> <% @tasks.each do |task| %> <li class="collection-item dismissable"><div><%= task.description %><a href="/todo/<%= task.id %>" class="secondary-content"><i class="material-icons">check</i></a></div></li> <%= link_to 'Activate', done_task(task.id), method: :put %> <% end %> </ul> <% end %> <h4 class="header">What I do</h4> <ul class="collection"> <% @tasks_done.each do |task| %> <li class="collection-item dismissable"><div><%= task.description %><a href="/todo/<%= task.id %>" class="secondary-content"><i class="material-icons">check</i></a></div></li> <%= link_to 'Activate', done_task(task.id), method: :put %> <% end %> </ul> </div> |
1 2 3 4 |
.header{ color: #ee6e73; font-weight: 300; } |
19 – Vamos criar o teste do nosso Model Task, no arquivo spec/models/task_spec.rb coloque:
1 2 3 4 5 6 7 8 9 10 11 12 |
require 'rails_helper' RSpec.describe Task, type: :model do before do @task = create(:task, status: :todo) end it "The status is done" do @task.done expect(@task.status).to eq("done") end end |
20 – Crie um arquivo chamado task.rb na pasta factories e coloque nele:
1 2 3 4 5 6 7 8 |
require 'ffaker' FactoryGirl.define do factory :task do |f| f.description { FFaker::Lorem.word } f.status { :todo } end end |
21 – Rode o teste:
1 |
rspec spec/models/task_spec.rb |
22 – Vamos criar os testes do nosso Controller Task, no arquivo spec/controllers/task_controller_spec.rb coloque:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require 'rails_helper' RSpec.describe TaskController, type: :controller do describe "PUT #done" do before do end context "with valid task" do before do @task = create(:task, status: :todo) end it "The status will be changed" do put :done, params: {id: @task.id} @task.reload expect(@task.status).to eql("done") end end end end |
23 – Rode o teste:
1 |
rspec spec/controllers/task_controller_spec.rb |
24 – Pronto \o/
Se você ainda não se inscreveu no nosso canal do Youtube se inscreva e ajude o OneBitCode ir mais longe 🙂
Muito Obrigado por acompanhar este Blog!
Sua presença aqui é uma honra para mim,
Abraços,
Leonardo Scorza