/* CODIFICANDO */

Relatos de um programador em contínua aprendizagem.

Dica rápida: Testando igualdade entre arrays de models

com um comentário

É comum testarmos métodos que retornam arrays de models. Um bom exemplo disso é quando testamos named_scopes (eu gosto de testar named_scopes pra valer, batendo no banco e não somente usando macros como as do Remarkable). A grande pagadinha é que a ordem na qual os objetos serão retornados do banco é totalmente imprevisível, a não ser que seu método já traga os itens ordenados por padrão. Assim, testes como o exemplo abaixo podem hora passar, hora não:

describe ".active" do
  before :each do
    @user1 = User.make :active => true
    @user2 = User.make :active => false
    @user3 = User.make :active => true
    @user4 = User.make :active => false
  end

  it "retorna somente usuários ativos" do
    User.active.should == [@user1, @user4]
  end
end

Uma maneira segura de testar isso é usar a classe Set, da biblioteca padrão do Ruby. Um Set representa um conjunto matemático, sendo que a igualdade entre dois conjuntos existe quando ambos os conjuntos possuem exatamente os mesmos elementos, independentemente da ordenação. Assim, podemos reescrever a linha da spec que faz a asserção e termos certeza de que ele terá sempre o mesmo comportamento:

User.active.to_set.should == Set.new([@user1, @user4])

Escrito por cassiomarques

Setembro 23, 2009 às 1:45 am

Publicado em rails, ruby, testes

Etiquetado com , , ,

Uma resposta

Subscreva aos comentários comRSS.

  1. Ótima dica, já passei por isso aqui.

    Que essas dicas rápidas continuem =)

    Valeu!

    Jésus Lopes

    Setembro 23, 2009 em 5:54 pm


Deixe uma resposta