Unit testing Rspec:测试MongoMapper查询

Unit testing Rspec:测试MongoMapper查询,unit-testing,testing,rspec2,mongomapper,rspec-rails,Unit Testing,Testing,Rspec2,Mongomapper,Rspec Rails,我有一个方法: 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_em

我有一个方法:

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>'
故障:
1) 算法::Helpers::Facebook#fb(匹配)for(朋友)雇主(目标)方法返回可在fb上访问的用户
失败/错误:User.should_receive(:where).with(:is_reachable_on_fb=>true,
已接收:其中包含意外参数
预期:({:是否可访问?{u fb=>true,“jobs.employer”=>[“Apple”],:fb{u用户id=>[“101”,“201”],#=>[“100”,“200”],#=>“2”,“#=>“1”})
got:({:在[u fb=>true,“jobs.employer”=>[“Apple”],:fb\u用户id=>[“101”,“201”],[100”,“200”],[2”,“1”})上是否可以访问[u]
#./spec/lib/algorithm/helpers/facebook_spec.rb:44:in'block(3层)in'

据我所知,只是SYMBOL运算符不同。有没有想过如何避免这种情况并确认查询中的哈希正确?

问题与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
为了提高效率,我猜Ruby是在比较哈希代码,而不是进行实际的比较

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
,并向提交拉取请求。关于编写
hash
实现有一些讨论。

这个问题与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
为了提高效率,我猜Ruby是在比较哈希代码,而不是进行实际的比较

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
,并向提交拉取请求。关于编写
hash
实现,有一些讨论