RSpec ==/eql non può confrontare le "stesse" cose
-
27-10-2019 - |
Domanda
Ho un test dell'indice del controller che ottiene un ambito di Activecord. Il test è attualmente così (comprese alcune cose di debug in linea):
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
L'output è questo:
ActiveRecord::Relation
ActiveRecord::Relation
expected: []
got: [] (using ==)
Diff:
Questa non è sicuramente la prima volta che lo faccio nelle recenti versioni di Rails e RSPEC. In precedenza un collega avrebbe semplicemente avvolto gli oggetti in un to_a
Per confrontarli, che trovo un po 'sporco e probabilmente non una buona soluzione.
Qualche idea? Sono curioso di sapere perché pensa che siano diversi e come questo stesso test sia passato nelle versioni precedenti di Rails e/o RSPEC.
Soluzione
eql equivale a ==. L'autore di RSPEC Talks non usa solo !=, uso non dovrebbe invece
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))
Aggiornare: La relazione fornisce un modello di carico pigro, quindi non si dispone di alcuna query eseguita sul passaggio. Significa il fuoco la query sulla prima richiesta
Altri suggerimenti
Se vuoi confrontare gli array, dovresti scrivere
assigns(:schools).all.should =~ School.populated.all