RSpec
Testando suas aplicações Ruby on Rails
Hercules Lemke Merscher - @hlmerscher
Behavior Driven Development
gem install
gem install rspec
# Gemfile
group :development, :test do
gem 'rspec-rails'
end
bundle install
rails generate r...
estrutura
spec/
├── controllers
  │ └── produtos_controller_spec.rb
├── models
  │ ├── categoria_spec.rb
  │ └── produto_s...
spec/models/produto_spec.rb
describe Produto do
describe 'ativar' do
it 'deve ativar produto' do
produto = Produto.create(...
spec/models/produto_spec.rb
describe Produto do
describe '#ativar' do
let(:produto) do
Produto.create(nome: 'Cadeira',
val...
let / let!
let(:produto) do
Produto.new
end
let(:produto) { Produto.new }
let!(:produto) do
Produto.new
end
let!(:produto)...
before / after
before { produto.ativar }
before do
produto.ativar
end
after { produto.destroy }
after do
produto.destroy
e...
app/models/produto.rb
class Produto < ActiveRecord::Base
SITUACOES = %w(ativo inativo esgotado)
...
def ativar
update(stat...
spec/models/produto_spec.rb
describe Produto do
describe '#ativar' do
let(:produto) do
Produto.create(nome: 'Cadeira',
val...
matchers
expect(produto.valor).to eq 50
expect(produto.valor).not_to eq 50
expect(produto.valor).to be < 50
expect(produto...
app/models/produto.rb
class Produto < ActiveRecord::Base
SITUACOES = %w(ativo inativo esgotado)
...
def ativo?
status == '...
spec/models/produto_spec.rb
describe Produto do
describe '#ativo?' do
let(:produto) { Produto.new(status: 'ativo') }
it { ...
context
describe Produto do
describe '#ativo?' do
context 'quando ativo' do
let(:produto) { Produto.new(status: 'ativo') }...
context
describe Produto do
describe '#ativo?' do
...
context 'quando inativo' do
%w(inativo esgotado).each do |status|
le...
subject
describe Produto do
context 'sem usar subject' do
let(:produto) { Produto.new }
it { expect(produto).to respond_to...
subject
describe Produto do
describe '#ativo?' do
context 'quando ativo' do
subject { Produto.new(status: 'ativo') }
it { ...
expect vs should
Não use a sintaxe do should.
it { produto.valor.should eq 50 }
Prefira a sintaxe nova(não tão nova assim ...
produtos_controller_spec.rb
describe "POST create" do
describe "com parâmetros válidos" do
it "deve criar um novo produto"...
descrições curtas
describe "POST create" do
describe "com parâmetros válidos" do
before { post :create, :produto => valid_...
shared examples
module Codificavel
extend ActiveSupport::Concern
included do
before_validation :definir_codigo
end
private...
spec/support/shared_examples.rb
shared_examples_for 'codificavel' do |objeto|
subject(:codificavel) { objeto }
it { expect...
shared examples
describe Produto do
subject do
Produto.create(:nome => 'bla',
:valor => 50,
:status => 'ativo')
end
it_beh...
shared examples
describe Categoria do
subject do
Categoria.create(:nome => 'bla')
end
it_behaves_like 'codificavel', subje...
shoulda-matchers
# Gemfile
group :development, :test do
gem 'rspec-rails'
gem 'shoulda-matchers'
end
# spec_helper
require...
shoulda-matchers
describe Produto do
context 'validações' do
it { should validate_presence_of(:nome) }
it { should validat...
shoulda-matchers
describe Produto do
context 'relacionamentos' do
it { should belong_to(:categoria) }
end
end
describe Cat...
http://rspec.info/
http://betterspecs.org/
https://relishapp.com/rspec
Exemplos
https://github.com/hlmerscher/liberdade-interativa-2014
Obrigado!
www.herculesdev.com.br
hlmerscher@gmail.com
twitter.com/hlmerscher
github.com/hlmerscher
RSpec - Testando suas aplicações Ruby on Rails
Upcoming SlideShare
Loading in …5
×

RSpec - Testando suas aplicações Ruby on Rails

816 views

Published on

Palestra sobre testes automatizados utilizando BDD e RSpec para testar aplicações Ruby on Rails.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
816
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
5
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

RSpec - Testando suas aplicações Ruby on Rails

  1. 1. RSpec Testando suas aplicações Ruby on Rails Hercules Lemke Merscher - @hlmerscher
  2. 2. Behavior Driven Development
  3. 3. gem install gem install rspec # Gemfile group :development, :test do gem 'rspec-rails' end bundle install rails generate rspec:install rspec
  4. 4. estrutura spec/ ├── controllers   │ └── produtos_controller_spec.rb ├── models   │ ├── categoria_spec.rb   │ └── produto_spec.rb ├── routing   │ └── produtos_routing_spec.rb └── spec_helper.rb
  5. 5. spec/models/produto_spec.rb describe Produto do describe 'ativar' do it 'deve ativar produto' do produto = Produto.create(nome: 'Cadeira', valor: 200.0, status: 'inativo') expect(produto.ativar).to be_true end end end
  6. 6. spec/models/produto_spec.rb describe Produto do describe '#ativar' do let(:produto) do Produto.create(nome: 'Cadeira', valor: 200.0, status: 'inativo') end it { expect(produto.ativar).to be_true } end end
  7. 7. let / let! let(:produto) do Produto.new end let(:produto) { Produto.new } let!(:produto) do Produto.new end let!(:produto) { Produto.new }
  8. 8. before / after before { produto.ativar } before do produto.ativar end after { produto.destroy } after do produto.destroy end
  9. 9. app/models/produto.rb class Produto < ActiveRecord::Base SITUACOES = %w(ativo inativo esgotado) ... def ativar update(status: 'ativo') end end
  10. 10. spec/models/produto_spec.rb describe Produto do describe '#ativar' do let(:produto) do Produto.create(nome: 'Cadeira', valor: 200.0, status: 'inativo') end before { @resultado = produto.ativar } it { expect(@resultado).to be_true } it { expect(produto.status).to eq 'ativo' } end end
  11. 11. matchers expect(produto.valor).to eq 50 expect(produto.valor).not_to eq 50 expect(produto.valor).to be < 50 expect(produto.valor).to be >= 50 expect(produto.valid?).to be_true expect(produto).to be_valid
  12. 12. app/models/produto.rb class Produto < ActiveRecord::Base SITUACOES = %w(ativo inativo esgotado) ... def ativo? status == 'ativo' end end
  13. 13. spec/models/produto_spec.rb describe Produto do describe '#ativo?' do let(:produto) { Produto.new(status: 'ativo') } it { expect(produto.ativo?).to be_true } it { expect(produto).to be_ativo } end end
  14. 14. context describe Produto do describe '#ativo?' do context 'quando ativo' do let(:produto) { Produto.new(status: 'ativo') } it { expect(produto).to be_ativo } end context 'quando inativo' do let(:produto) { Produto.new(status: 'inativo') } it { expect(produto).not_to be_ativo } end end end
  15. 15. context describe Produto do describe '#ativo?' do ... context 'quando inativo' do %w(inativo esgotado).each do |status| let(:produto) { Produto.new(status: status) } it { expect(produto).not_to be_ativo } end end end end
  16. 16. subject describe Produto do context 'sem usar subject' do let(:produto) { Produto.new } it { expect(produto).to respond_to(:nome) } end context 'usando subject' do it { should respond_to(:nome) } end end
  17. 17. subject describe Produto do describe '#ativo?' do context 'quando ativo' do subject { Produto.new(status: 'ativo') } it { should be_ativo } end ... end end
  18. 18. expect vs should Não use a sintaxe do should. it { produto.valor.should eq 50 } Prefira a sintaxe nova(não tão nova assim :P) do expect. it { expect(produto.valor).to eq 50 }
  19. 19. produtos_controller_spec.rb describe "POST create" do describe "com parâmetros válidos" do it "deve criar um novo produto" do expect { post :create, {:produto => valid_attributes} }.to change(Produto, :count).by(1) end it "deve atribuir o produto criado como @produto" do post :create, {:produto => valid_attributes} expect(assigns(:produto)).to be_a(Produto) expect(assigns(:produto)).to be_persisted end it "deve redirecionar para página do produto criado" do post :create, {:produto => valid_attributes} expect(response).to redirect_to(Produto.last) end end end
  20. 20. descrições curtas describe "POST create" do describe "com parâmetros válidos" do before { post :create, :produto => valid_attributes } it { expect(assigns(:produto)).to be_a Produto } it { expect(assigns(:produto)).to be_persisted } it { expect(response).to redirect_to assigns(:produto) } end end
  21. 21. shared examples module Codificavel extend ActiveSupport::Concern included do before_validation :definir_codigo end private def definir_codigo self.codigo = SecureRandom.hex(6) end end
  22. 22. spec/support/shared_examples.rb shared_examples_for 'codificavel' do |objeto| subject(:codificavel) { objeto } it { expect(codificavel.codigo).to be_a String } it { expect(codificavel.codigo).not_to be_blank } end
  23. 23. shared examples describe Produto do subject do Produto.create(:nome => 'bla', :valor => 50, :status => 'ativo') end it_behaves_like 'codificavel', subject end
  24. 24. shared examples describe Categoria do subject do Categoria.create(:nome => 'bla') end it_behaves_like 'codificavel', subject end
  25. 25. shoulda-matchers # Gemfile group :development, :test do gem 'rspec-rails' gem 'shoulda-matchers' end # spec_helper require 'rspec/rails' require 'shoulda/matchers'
  26. 26. shoulda-matchers describe Produto do context 'validações' do it { should validate_presence_of(:nome) } it { should validate_uniqueness_of(:nome) } it { should validate_numericality_of(:valor) .is_greater_than(0) } it { should ensure_inclusion_of(:status) .in_array(Produto::SITUACOES) } end end
  27. 27. shoulda-matchers describe Produto do context 'relacionamentos' do it { should belong_to(:categoria) } end end describe Categoria do context 'relacionamentos' do it { should have_many(:produtos) } end end
  28. 28. http://rspec.info/ http://betterspecs.org/ https://relishapp.com/rspec
  29. 29. Exemplos https://github.com/hlmerscher/liberdade-interativa-2014
  30. 30. Obrigado! www.herculesdev.com.br hlmerscher@gmail.com twitter.com/hlmerscher github.com/hlmerscher

×