Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

×