rspec ==/eql no puede comparar las cosas 'mismas'
-
27-10-2019 - |
Pregunta
Tengo una prueba de índice de controlador que obtiene un alcance de Activerecord. La prueba actualmente se ve así (incluidas algunas cosas de depuración en línea):
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 salida es esta:
ActiveRecord::Relation
ActiveRecord::Relation
expected: []
got: [] (using ==)
Diff:
Esta definitivamente no es la primera vez que tengo esto en versiones recientes de Rails y RSPEC. Anteriormente, un compañero de trabajo simplemente envolvería los artículos en un to_a
Para compararlos, lo cual encuentro un poco sucio y probablemente no es una buena solución.
¿Algunas ideas? Tengo curiosidad por saber por qué piensa que son diferentes, y cómo se pasó esta misma prueba en versiones anteriores de rieles y/o RSPEC.
Solución
EQL es lo mismo que ==. Autor de RSPEC Talks solo no usa !=, usar no debe en cambio
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))
Actualizar: La relación proporciona un patrón de carga perezoso, por lo que no tiene ninguna consulta ejecutada en el paso. Significa el incendio la consulta en primera solicitud
Otros consejos
Si desea comparar matrices, debe escribir
assigns(:schools).all.should =~ School.populated.all