RSPEC: Prueba de consulta de Mongomapper
-
28-10-2019 - |
Pregunta
Tengo un método:
def fb_matches_for_friend_employer_goals(user, friend)
User.where( :is_reachable_on_fb => true, # Users that are reachable on FB via wall posts
"jobs.employer" => friend.interested_employers, # Users that have worked at the employers the friend is interested
:fb_user_id => user.fb_connections, # Users that are friends of user through FB
:fb_user_id.nin => friend.fb_connections, # Users that are NOT friends with the friend through FB
:fb_user_id.ne => user.fb_user_id, # Users that are NOT the user
:fb_user_id.ne => friend.fb_user_id # Users that are NOT the friend (although it's likely the friend hasn't worked at the goal employer)
).fields(:id, :jobs, :fb_connections).all
end
Y una prueba:
describe "#fb_matches_for_friend_employer_goals method" do
let(:friend) { stub_model(User) }
before(:each) do
User.stub(where: User, fields: User, all: User)
friend.stub(interested_employers: ["Apple"])
friend.stub(fb_connections: ["100", "200"])
friend.stub(fb_user_id: "1")
user.stub(fb_connections: ["101", "201"])
user.stub(fb_user_id: "2")
end
it "returns users that are reachable on FB" do
User.should_receive(:where).with( :is_reachable_on_fb => true,
"jobs.employer" => ["Apple"],
:fb_user_id => ["101", "201"],
:fb_user_id.nin => ["100", "200"],
:fb_user_id.ne => "2",
:fb_user_id.ne => "1")
a.fb_matches_for_friend_employer_goals(user, friend)
end
end
Obtuve el siguiente error:
Failures:
1) Algorithm::Helpers::Facebook#fb_matches_for_friend_employer_goals method returns users that are reachable on FB
Failure/Error: User.should_receive(:where).with( :is_reachable_on_fb => true,
<User (class)> received :where with unexpected arguments
expected: ({:is_reachable_on_fb=>true, "jobs.employer"=>["Apple"], :fb_user_id=>["101", "201"], #<SymbolOperator:0x007f9e28bac958 @field=:fb_user_id, @operator="nin">=>["100", "200"], #<SymbolOperator:0x007f9e28bac778 @field=:fb_user_id, @operator="ne">=>"2", #<SymbolOperator:0x007f9e28bac688 @field=:fb_user_id, @operator="ne">=>"1"})
got: ({:is_reachable_on_fb=>true, "jobs.employer"=>["Apple"], :fb_user_id=>["101", "201"], #<SymbolOperator:0x007f9e28babcd8 @field=:fb_user_id, @operator="nin">=>["100", "200"], #<SymbolOperator:0x007f9e28bab6c0 @field=:fb_user_id, @operator="ne">=>"2", #<SymbolOperator:0x007f9e28bab148 @field=:fb_user_id, @operator="ne">=>"1"})
# ./spec/lib/algorithm/helpers/facebook_spec.rb:44:in `block (3 levels) in <module:Helpers>'
Por lo que puedo decir, es solo que los simbolistas son diferentes. ¿Alguna idea sobre cómo evitar esto y confirmar que el hash correcto está entrando en la consulta?
Solución
El problema tiene que ver con la forma en que se calcula la igualdad de hash en Ruby.
1.9.2-p0 :001 > :something.nin == :something.nin
=> true
1.9.2-p0 :002 > {:something.nin => 'hi'} == {:something.nin => 'hi'}
=> false
1.9.2-p0 :003 > {:something => 'hi'} == {:something => 'hi'}
=> true
Para la eficiencia, supongo que Ruby está comparando las codificaciones hash en lugar de hacer ==
comparaciones.
1.9.2-p0 :004 > {:something => 'hi'}.hash
=> 2493047093815769983
1.9.2-p0 :005 > {:something => 'hi'}.hash
=> 2493047093815769983
1.9.2-p0 :006 > {:something.nin => 'hi'}.hash
=> 2609636779135588412
1.9.2-p0 :007 > {:something.nin => 'hi'}.hash
=> -424522258459261487
1.9.2-p0 :008 > :something.hash
=> 3062293424662012631
1.9.2-p0 :009 > :something.hash
=> 3062293424662012631
1.9.2-p0 :010 > :something.nin.hash
=> -1304763062464413657
1.9.2-p0 :011 > :something.nin.hash
=> 2727789822935992035
La solución más permanente para su problema es definir hash
para operadores de símbolos y envíe una solicitud de extracción a valeroso. Hay alguna discusión aquí Al escribir un hash
implementación.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow