Dica rápida: Testando igualdade entre arrays de models
É 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])



Ótima dica, já passei por isso aqui.
Que essas dicas rápidas continuem =)
Valeu!
Jésus Lopes
Setembro 23, 2009 em 5:54 pm