Rspec == / eql ne peut pas comparer les choses « même »
-
27-10-2019 - |
Question
J'ai un test d'index du contrôleur qui obtient une portée ActiveRecord. Le test ressemble actuellement à ceci (y compris des trucs de débogage en ligne):
describe "GET index" do
it "assigns all schools as @schools" do
get :index
puts assigns(:schools).class
puts School.populated.class
assigns(:schools).should == School.populated
end
end
La sortie est la suivante:
ActiveRecord::Relation
ActiveRecord::Relation
expected: []
got: [] (using ==)
Diff:
Ceci est certainement pas la première fois que je l'ai eu dans les versions récentes de Rails et Rspec.
Auparavant, un collègue de travail serait tout simplement envelopper les articles dans un to_a
de les comparer, que je trouve un sale peu et probablement pas une bonne solution.
Toutes les idées? Je suis curieux de savoir pourquoi il pense qu'ils sont différents, et comment ce même test passé dans les anciennes versions de Rails et / ou Rspec.
La solution
eql est le même que == . Auteur de Rspec ne parle que ne pas utiliser ! = , utilisez should_not au lieu
actual.should == expected
#is interpreted as this:
actual.should.==(expected)
#This is not true for !=. Ruby interprets this: actual.should != expected
#as follows:
!(actual.should.==(expected))
Mise à jour : Relation fournit modèle de charge Lazy, de sorte que vous n'avez pas requête exécutée sur l'étape. Cela signifie que le feu de la requête sur la première demande
Autres conseils
Si vous voulez comparer les tableaux, vous devez écrire
assigns(:schools).all.should =~ School.populated.all