Skip to content
março 31, 2009 / cassiomarques

Testando chamadas a named_scopes em specs de controllers

É muito comum termos actions que fazem uso de named_scopes definidos em nossos models. Como testar isso nas specs dos controllers com o Rspec? Para um caso simples, onde temos uma única chamada, podemos fazer algo assim:

# nossa spec
describe 'pending_orders action' do
  it "should search for the pending orders" do
    Order.should_receive(:pending).and_return([mock_model(Order, :status => Order::PENDING)])
    get :pending_orders
  end
end

# nossa action
def pending_orders
  @orders = Order.pending
end

Mas e quando temos várias chamadas a named_scopes encadeadas? Por exemplo, se quisermos pesquisar os pedidos pendentes e em seguida ordená-los por data, como poderiamos escrever nossa spec? O problema aqui é que não podemos simplesmente esperar que a execução da action passe uma mensagem do tipo ordered_by ou algo parecido para o array de mocks que retornamos no exemplo acima, já que um array não saberia responder a este método. A solução é fazer mocking de cada chamada a um named scope retornando sempre a própria classe de interesse, até o penúltimo. O último pode novamente retornar um array.

# nossa spec
describe 'pending_orders action' do
  it "should search for the pending orders ordered by creation date" do
    Order.should_receive(:pending).and_return(Order)
    Order.should_receive(:ordered_by).with(:created_at).and_return([mock_model(Order, :status => Order::PENDING)])
    get :pending_orders
  end
end

# nossa action
def pending_orders
  @orders = Order.pending.ordered_by(:created_at)
end

Para encadeamentos mais longos, basta repetir a técnica. Garantimos que os named scopes são devidamente chamados sem problemas nas nossas actions, nossos testes passam e podemos ir pra casa.

2 Comentários

Deixe um comentário
  1. lucascaton / abr 1 2009 1:15 am

    Legal. Eu só preciso agora descobrir o que são named_scopes, specs, Rspec, mocks e mocking. Mas estou estudando e vou chegar lá :D

    Parabéns pelos posts Cássio.

  2. uchoaaa / abr 2 2009 3:16 pm

    Legal, cara. Depois de algumas tentativas, eu cheguei a essa forma de testar meus named_scopes.. Certamente seria ótimo ter lido esse post antes!

    Abraços

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: