Aprendendo Ruby on Rails – Aula 5
  – Testes com RSpec e Cucumber
                     Maurício Linhares
O que é o RSpec?
   É um ferramenta de Behaviour Driven Development;

   Uma solução simples para implementar testes de
...
Adicionando o RSpec na sua aplicação Rails
– config/environments/test.rb
sudo gem install rspec rspec-rails factory_girl
 ...
Gerando o código inicial do RSpec
script/generate rspec
config.gem “factory_girl” ?
   Gem de suporte a testes, ajuda a criar objetos para
    os testes da aplicação;

   É uma...
Criando as sequências –
spec/factories/sequences.rb
Factory.sequence :nome do |n|
 "Nome #{n}"
end

Factory.sequence :emai...
Criando as fábricas – usuario_factory.rb
Factory.define :usuario do |f|
 f.nome { Factory.next(:nome) }
 f.email { Factory...
Criando as fábricas – produto_factory.rb
Factory.define :produto do |f|
f.nome     { Factory.next(:nome) }
f.preco 10.0
f....
Criando as fábricas – item_factory.rb

Factory.define :item do |f|
 f.quantidade 5
 f.association :produto, :factory => :p...
Criando as fábricas – pedido_factory.rb

Factory.define :pedido do |f|
 f.estado 'carrinho'
end
Criando o spec de produto com Remarkable
require( File.expand_path( File.join( File.dirname(__FILE__), '..',
  'spec_helpe...
Métodos do RSpec
   “describe” – define a classe/objeto que está sendo
    testado;

   “context” – define o escopo no q...
Criando o spec pra Item
require( File.expand_path( File.join( File.dirname(__FILE__), '..', 'spec_helper' ) ) )

describe ...
Criando o spec para Pedido
context 'em operacoes' do

  before do
   @produto_1 = Factory( :produto, :preco => 10 )
   @pr...
Criando o spec para o Pedido
context 'em operacoes' do

  context 'na implementação de blank' do

   it 'deve retornar ver...
Criando o spec de Pedido
context 'ao unir pedidos' do

   before do
    @pedido.adicionar_produto( @produto_1, 2 )
    @pe...
Criando o spec de Pedido
context 'ao adicionar um produto ao pedido' do

   before do
    @pedido.adicionar_produto( @prod...
Criando o spec de Pedido
context 'deve remover itens zerados após salvar o pedido' do

   before do
    @pedido.adicionar_...
Criando o spec de Usuario
context 'em associações' do

 it { should have_many(:pedidos) }
 it { should have_one(:pedido_at...
Criando a spec de Usuario
context 'em chamadas de senha_necessaria?' do

 before do
  @usuario = Factory(:usuario)
  @usua...
Criando a spec de Usuario
context 'ao criar um usuário' do

 before do
  @usuario = Factory.build(:usuario)
 end

  it 'de...
Criando a spec de Usuario
context 'em chamadas de autenticação' do

 before do
  @usuario = Factory(:usuario,
   :senha =>...
Criando spec para SessoesController
context 'em chamadas pra se fazer o login do usuario' do

  before do
   @usuario = Fa...
Criando spec para SessoesController
context 'com dados corretos' do

   it 'deve colocar o usuario na sessao' do
     do_p...
Criando spec para SessoesController
context 'com dados incorretos' do

   it 'deve mostrar a página new' do
     do_post( ...
Upcoming SlideShare
Loading in...5
×

Cuso Ruby - Aula 05 - Testes com RSpec

1,190

Published on

Material de apoio da aula de testes com RSpec do curso de Rails.

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

  • Be the first to like this

No Downloads
Views
Total Views
1,190
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
54
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Cuso Ruby - Aula 05 - Testes com RSpec

  1. 1. Aprendendo Ruby on Rails – Aula 5 – Testes com RSpec e Cucumber Maurício Linhares
  2. 2. O que é o RSpec?  É um ferramenta de Behaviour Driven Development;  Uma solução simples para implementar testes de unidade na sua aplicação;  Tem suporte direto a Rails para testar modelos, helpers e controllers;
  3. 3. Adicionando o RSpec na sua aplicação Rails – config/environments/test.rb sudo gem install rspec rspec-rails factory_girl remarkable_rails # configurando as gems necessárias config.gem 'rspec', :lib => false config.gem 'rspec-rails', :lib => false config.gem 'factory_girl' config.gem 'remarkable_rails', :lib => false config.gem 'remarkable_activerecord', :lib => false
  4. 4. Gerando o código inicial do RSpec script/generate rspec
  5. 5. config.gem “factory_girl” ?  Gem de suporte a testes, ajuda a criar objetos para os testes da aplicação;  É uma “fábrica de objetos” genéricos para evitar a repetição de código para testes na aplicação;  Existem outras gems que executam o mesmo trabalho, como “machinist”, todas fazem a mesma coisa mas de formas diferentes;  As fábricas ficam em “spec/factories”;
  6. 6. Criando as sequências – spec/factories/sequences.rb Factory.sequence :nome do |n| "Nome #{n}" end Factory.sequence :email do |n| "eu_#{n}@mail.com" end
  7. 7. Criando as fábricas – usuario_factory.rb Factory.define :usuario do |f| f.nome { Factory.next(:nome) } f.email { Factory.next(:email) } f.senha "123456" f.senha_confirmation "123456" f.ultimo_acesso_em { Time.now } end
  8. 8. Criando as fábricas – produto_factory.rb Factory.define :produto do |f| f.nome { Factory.next(:nome) } f.preco 10.0 f.descricao "Descrição de exemplo" end
  9. 9. Criando as fábricas – item_factory.rb Factory.define :item do |f| f.quantidade 5 f.association :produto, :factory => :produto f.association :pedido, :factory => :pedido end
  10. 10. Criando as fábricas – pedido_factory.rb Factory.define :pedido do |f| f.estado 'carrinho' end
  11. 11. Criando o spec de produto com Remarkable require( File.expand_path( File.join( File.dirname(__FILE__), '..', 'spec_helper' ) ) ) describe Produto do context 'ao ser validado' do it { should validate_presence_of :nome } it { should validate_presence_of :preco } it { should validate_numericality_of :preco, :allow_blank => true, :greater_than => 0 } end end
  12. 12. Métodos do RSpec  “describe” – define a classe/objeto que está sendo testado;  “context” – define o escopo no qual o objeto está sendo testado  “it” – define o teste que vai ser executado  “before” – define um bloco de código que é utilizado para inicializar os objetos antes do teste
  13. 13. Criando o spec pra Item require( File.expand_path( File.join( File.dirname(__FILE__), '..', 'spec_helper' ) ) ) describe Item do context 'ao ser associado a outros objetos' do it { should belong_to(:pedido) } it { should belong_to(:produto) } end context 'ao se calcular preços' do before do @produto = Factory(:produto, :preco => 20) @item = Factory( :item, :produto => @produto , :quantidade => 6 ) end it 'deve ter como preço 120' { @item.preco_total.should == 120 } end end
  14. 14. Criando o spec para Pedido context 'em operacoes' do before do @produto_1 = Factory( :produto, :preco => 10 ) @produto_2 = Factory( :produto, :preco => 20 ) @produto_3 = Factory( :produto, :preco => 30 ) @pedido = Factory( :pedido ) end it 'deve ter como preço total a suma dos preços individuais dos itens' do @pedido.adicionar_produto( @produto_1, 2 ) @pedido.adicionar_produto( @produto_2, 5 ) @pedido.preco_total.should == 120 end end
  15. 15. Criando o spec para o Pedido context 'em operacoes' do context 'na implementação de blank' do it 'deve retornar verdadeiro se o pedido estiver vazio' do @pedido.should be_blank end it 'deve retornar false se o pedido não estiver vazio' do @pedido.adicionar_produto( @produto_1, 3 ) @pedido.should_not be_blank end end end
  16. 16. Criando o spec de Pedido context 'ao unir pedidos' do before do @pedido.adicionar_produto( @produto_1, 2 ) @pedido.adicionar_produto( @produto_2, 3 ) @pedido_2 = Factory(:pedido) @pedido_2.adicionar_produto( @produto_2, 2 ) @pedido_2.adicionar_produto( @produto_3, 3 ) @pedido.unir( @pedido_2 ) end it 'o pedido final deve ter o total de itens dos dois pedidos' do @pedido.item_por_produto( @produto_1 ).quantidade.should == 2 @pedido.item_por_produto( @produto_2 ).quantidade.should == 5 @pedido.item_por_produto( @produto_3 ).quantidade.should == 3 end end
  17. 17. Criando o spec de Pedido context 'ao adicionar um produto ao pedido' do before do @pedido.adicionar_produto( @produto_1, 5 ) end it 'deve adicionar um produto como item do pedido' do @pedido.itens.size.should == 1 end it 'deve adicionar o produto corretamente' do @pedido.itens.first.produto == @produto_1 end it 'deve aumentar a quantidade de itens ao adicionar o mesmo item denovo' do @pedido.adicionar_produto( @produto_1, 3 ) @pedido.itens.first.quantidade.should == 8 end end
  18. 18. Criando o spec de Pedido context 'deve remover itens zerados após salvar o pedido' do before do @pedido.adicionar_produto(@produto_1, 1) @pedido.adicionar_produto(@produto_2, 2) @pedido.save! end it 'deve remover o produto' do @pedido.itens.last.update_attribute( :quantidade, 0 ) @pedido.save! @pedido.item_por_produto( @produto_2 ).should be_nil end end
  19. 19. Criando o spec de Usuario context 'em associações' do it { should have_many(:pedidos) } it { should have_one(:pedido_atual) } end context 'em validações' do it { should validate_presence_of( :nome ) } it { should validate_presence_of( :email ) } it { should validate_acceptance_of(:termos_e_condicoes) } it { should validate_presence_of(:senha_em_hash, :if => :senha_necessaria?) } it { should validate_length_of(:senha, :within => 4..40, :if => :senha_necessaria?) } it { should validate_confirmation_of(:senha, :if => :senha_necessaria?) } end
  20. 20. Criando a spec de Usuario context 'em chamadas de senha_necessaria?' do before do @usuario = Factory(:usuario) @usuario.senha = nil end it 'deve retornar false quando o hash da senha não for vazio' do @usuario.senha_necessaria?.should be_false end it 'deve retornar true quando a senha for preenchida' do @usuario.senha = "123456" @usuario.senha_necessaria?.should be_true end it 'deve retornar true quando o hash da senha for vazio' do @usuario.senha_em_hash = nil @usuario.senha_necessaria?.should be_true end end
  21. 21. Criando a spec de Usuario context 'ao criar um usuário' do before do @usuario = Factory.build(:usuario) end it 'deve enviar um email' do UsuariosMailer.should_receive( :deliver_registro ).with(@usuario) @usuario.save! end end
  22. 22. Criando a spec de Usuario context 'em chamadas de autenticação' do before do @usuario = Factory(:usuario, :senha => '123456', :senha_confirmation => '123456') end it 'deve autenticar o usuário se estiver com a senha correta' do Usuario.autenticar(@usuario.email, '123456').should == @usuario end it 'não deve autenticar se a senha estiver errada' do Usuario.autenticar( @usuario.email, "654321" ).should be_nil end end
  23. 23. Criando spec para SessoesController context 'em chamadas pra se fazer o login do usuario' do before do @usuario = Factory(:usuario, :senha => "123456", :senha_confirmation => '123456') end def do_post( senha, email = @usuario.email ) post :create, :email => email, :senha => senha end end
  24. 24. Criando spec para SessoesController context 'com dados corretos' do it 'deve colocar o usuario na sessao' do do_post( '123456' ) session[:usuario_id].should == @usuario.id end it 'deve redirecionar para a listagem de produtos' do do_post( '123456' ) response.should redirect_to( produtos_path ) end it 'deve colocar uma mensagem na flash' do do_post('123456') flash[:aviso].should == "Seja bem vindo a nossa loja, #{@usuario.nome}" end end
  25. 25. Criando spec para SessoesController context 'com dados incorretos' do it 'deve mostrar a página new' do do_post( 'falso!' ) response.should render_template(:new) end it 'deve colocar uma mensagem na flash' do do_post('falso!') response.flash[:erro].should == "Não foi encontrado um usuário com o email e a senha que você forneceu" end end
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×