2012-01-13 34 views
1

我有一个方法:Rspec的:测试MongoMapper查询

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 

和测试:

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 

我收到以下错误:

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>' 

从我可以告诉,这只是SymbolOperators的不同之处。关于如何避免这种情况并确认正确的散列的任何想法将进入查询?

回答

1

问题与红宝石中散列相等的计算方式有关。

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 

为了提高效率,我想红宝石是比较哈希码而不是做实际==比较。

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 

你麻烦,最永久的解决办法是定义为hash符号运营商和提交pull请求plucky。关于编写hash实现有一些讨论here