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
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. 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. 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. subject
describe Produto do
describe '#ativo?' do
context 'quando ativo' do
subject { Produto.new(status: 'ativo') }
it { should be_ativo }
end
...
end
end
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. 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. 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. 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
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. 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