O documento discute vários tópicos relacionados a testes de software, incluindo boot de aplicações, princípio da responsabilidade única, gems usadas em um projeto Ruby on Rails, objetos plain old Ruby (POROs), formas de carregar arquivos de modo mais rápido para testes, execução de testes evitando banco de dados e testes de integração.
4. Single Responsability Principle
Nunca deve existir mais de uma razão para que uma classe mude.
quinta-feira, 3 de maio de 2012
5. Gemfile
gem ‘rails’
gem ‘airbrake’
gem ‘cancan’
gem ‘carrierwave’
gem ‘devise’
gem ‘enumerate_it’
gem ‘foreigner’
gem ‘omniauth’
gem ‘pg’
# ... 21 gems -> Total
quinta-feira, 3 de maio de 2012
6. PORO(Plain Old Ruby Objects)
class OmniAuthUser
def initialize(user)
@user = user
end
def create(omni_auth_data={})
# ...
end
end
quinta-feira, 3 de maio de 2012
7. PORO(Plain Old Ruby Object)
require ‘spec_helper’
describe OmniAuthUser do
let(:data) { stub(:provider => :facebook, ‘...’) }
describe ‘#create’ do
# ...
end
end
quinta-feira, 3 de maio de 2012
8. Necessário?
⤷ time rspec spec/spec_helper.rb
real 0m8.194s
user 0m7.802s
sys 0m1.391s
quinta-feira, 3 de maio de 2012
9. 1º Solução - Trivial -> Require
$:.unshift File.expand_path(’../../’, __FILE__)
require_model :omni_auth_user
require ‘app/services/cielo’
quinta-feira, 3 de maio de 2012
10. Tempo da 1º Solução
⤷ time rspec spec/unit_test.rb
real 0m0.681s
user 0m0.544s
sys 0m0.138s
quinta-feira, 3 de maio de 2012
11. Desvantagem
require na mão! :
quinta-feira, 3 de maio de 2012
12. 2º Solução - ActiveSupport::Dependencies
quinta-feira, 3 de maio de 2012
13. 2º Solução - ActiveSupport::Dependencies
require ‘active_support/dependencies’
%w(app/business app/models).each do |path|
ActiveSupport::Dependencies.autoload_paths.push(path)
end
quinta-feira, 3 de maio de 2012
14. Tempo da 2º Solução
⤷ time rspec spec/unit_test.rb
real 0m0.476s
user 0m0.352s
sys 0m0.121s
quinta-feira, 3 de maio de 2012
16. Execução - Cada caso é diferente. Mas evite bater
no Banco de Dados.
quinta-feira, 3 de maio de 2012
17. Execução - Minha Dica: Se não precisa, não crie
registros no Banco de Dados. Pense em cada
caso.
quinta-feira, 3 de maio de 2012
18. Execução - Exemplo do Gateway
class Account < ActiveRecord::Base
def disable_show_first_steps
update_attributes!(:show_first_steps => false)
end
end
quinta-feira, 3 de maio de 2012
19. Execução - Exemplo do Gateway
require ‘model_test’
describe Account do
describe ‘#disable_show_first_steps’ do
it ‘#should disable first steps on database’ do
subject.stub(:update_attributes!).with(:show_first_steps => false)
subject.disable_show_first_steps
end
end
end
quinta-feira, 3 de maio de 2012
20. Testes de Integração
# encoding: utf-8
require ‘integration_test’
describe ‘Interface Accounts’ do
it ‘should not show first steps if click Dont show first steps again’ do
sign_in
visit root_path
page.should have_content(‘Primeiros Passos ... ... ...’)
click ‘Não exibir novamente’
page.should have_content(‘Caso queira ver de novo ... ... ...’)
page.should_not have_content(‘Primeiros Passos ... ... ...’)
end
end
quinta-feira, 3 de maio de 2012