2013-02-21 98 views
0

我定義了以下用戶類別與範圍:如何測試mongoid範圍?

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::Search 

    # SCOPES 
    scope :all_admins, where(role: :admin) 
    scope :recents, order_by(created_at: :desc) 
    scope :olders, order_by(created_at: :asc) 

    field :role, type: Symbol 
end 

如果我用下面的RSpec的測試:

describe 'scopes' do 
    let(:admin1)   { Fabricate(:admin) } 
    let(:admin2)    { Fabricate(:admin) } 

    describe 'recents' do 
    it 'should return the admins from most recent to older' do 
     User.all_admins.recents.should eq([admin1, admin2]) 
    end 
    end 
end 

我得到以下失敗消息:

got: #<Mongoid::Criteria 
    selector: {"role"=>:admin}, 
    options: {:sort=>{"created_at"=>-1}}, 
    class: User, 
    embedded: false> 

怎麼可能我測試這個範圍?

回答

1

Mongoid延遲加載,這樣做:

User.all_admins.recents.to_a.should eq([admin1, admin2]) 

旁註:

  • 您應該創建範圍,有lambda表達式,它很快就會成爲常態與Rails4

  • 我mongo中的符號類型問題(遷移期間),我寧願使用字符串

  • 我敢肯定,因爲在DB不創建你的對象您的測試將失敗(let不計算,直到它被稱爲,用let!替換)

+0

我不知道如果沒有有高架即使沒有必要,也可以將範圍作爲lambda表達式。你有沒有看到有關這個問題的任何事情? – ksol 2013-02-21 09:28:56

+0

偉大的:to_a完成了這項工作。讓!也參與瞭解決方案的一部分,因爲這些對象不是用let創建的。 – obo 2013-02-26 08:10:07