rSpec ==/eql can't compare the 'same' things
-
27-10-2019 - |
Pergunta
I have a controller index test that gets an ActiveRecord scope. The test currently looks like this (including some inline debugging stuff):
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
The output is this:
ActiveRecord::Relation
ActiveRecord::Relation
expected: []
got: [] (using ==)
Diff:
This is definitely not the first time I've had this in recent versions of Rails and rSpec.
Previously a coworker would just wrap the items in a to_a
to compare them, which I find a bit dirty and likely not a good solution.
Any ideas? I'm curious as to why it thinks they are different, and how this same test passed in older versions of Rails and/or rSpec.
Solução
eql is the same as ==. Author of Rspec talks only do not use !=, use should_not instead
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))
Update: Relation provides Lazy Load pattern, so you do not have any executed query on the step. It means the fire the query on first request
Outras dicas
If you want to compare arrays, you should write
assigns(:schools).all.should =~ School.populated.all