-
-
Save elissonmichael/211c2c4f480ea12d19aed68843ade173 to your computer and use it in GitHub Desktop.
Carrinho de Compras com Mock
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Carrinho | |
attr_reader :pedidos | |
def initialize(args) | |
@pedido_class = args[:pedido_class] | |
@pedidos = [] | |
end | |
def adicionar(produto) | |
@pedidos << @pedido_class.new(produto) | |
end | |
def produtos | |
pedidos.map(&:produto) | |
end | |
def alterar_quantidade(produto, nova_quantidade) | |
encontra_pedido_com(produto).alterar_quantidade(nova_quantidade) | |
end | |
def quantidade(produto) | |
encontra_pedido_com(produto).quantidade | |
end | |
def total | |
pedidos.sum(&:total) | |
end | |
private | |
def encontra_pedido_com(produto) | |
pedidos.detect{ |pedido| pedido.produto == produto } | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'minitest/autorun' | |
require_relative 'carrinho' | |
describe Carrinho do | |
def setup | |
@carrinho = Carrinho.new(pedido_class: Minitest::Mock) | |
@produto_dummy = Object.new | |
@carrinho.adicionar(@produto_dummy) | |
@pedido_mock = @carrinho.pedidos.first | |
end | |
describe :produtos do | |
it "retorna os produtos adicionados" do | |
@pedido_mock.expect(:produto, @produto_dummy) | |
@carrinho.produtos.must_equal [@produto_dummy] | |
end | |
end | |
describe :alterar_quantidade do | |
it "envia uma mensagem de comando para pedido" do | |
@pedido_mock.expect(:produto, @produto_dummy) | |
@pedido_mock.expect(:alterar_quantidade, true, [3]) | |
@carrinho.alterar_quantidade(@produto_dummy, 3) | |
@pedido_mock.verify | |
end | |
end | |
# Segundo Metz não precisamos testar mensagens de saída | |
# que sejam apenas consultas, esse teste poderia ser removido. | |
describe :total do | |
it "envia uma mensagem de consulta para pedido" do | |
@pedido_mock.expect(:total, 30) | |
@carrinho.total | |
@pedido_mock.verify | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Pedido | |
attr_reader :produto, :quantidade | |
def initialize(produto) | |
@produto = produto | |
@quantidade = 1 | |
end | |
def alterar_quantidade(nova_quantidade) | |
@quantidade = nova_quantidade | |
end | |
def total | |
produto.preco * quantidade | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'minitest/autorun' | |
require_relative 'pedido' | |
describe Pedido do | |
def setup | |
@produto_mock = MiniTest::Mock.new | |
@pedido = Pedido.new(@produto_mock) | |
end | |
it "permite alterar a quantidade" do | |
@pedido.alterar_quantidade(99) | |
@pedido.quantidade.must_equal 99 | |
end | |
it "retorna o valor total" do | |
@produto_mock.expect(:preco, 30) | |
@pedido.total.must_equal 30 | |
end | |
end |
Uma alternativa é delegar a criação do pedido para uma fábrica, de modo que possa ser manipulada para retorrnar o objeto devido.
É também possível pensar as classes Carrinho
e Pedido
como um aggregate, e com essa visão talvez não seja necessário testá-las com um grau tão alto de isolamento.
Obrigado @rodrigomanhaes, gostei do aggregate.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Obrigado @douglascamata, muito bom.