Rspec: Test requête MongoMapper
-
28-10-2019 - |
Question
J'ai une méthode:
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
Et un test:
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
je reçois l'erreur suivante:
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>'
D'après ce que je peux dire, il est juste que les SymbolOperators sont différents. des idées sur la façon d'éviter cela et confirmer le hachage droite va dans la requête?
La solution
Le problème a à voir avec l'égalité de hachage façon est calculée 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
Pour plus d'efficacité, je suppose que Ruby compare les codes de hachage plutôt que de faire des comparaisons réelles ==
.
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
Le correctif plus permanent pour votre problème est de définir hash
pour les opérateurs de symboles et soumettre une demande de traction plucky . Il y a une discussion sur la rédaction d'une implémentation hash
.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow