如何测试mongoid范围?

时间:2013-02-21 09:14:00

标签: ruby-on-rails rspec mongoid

我使用范围定义了以下User类:

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 个答案:

答案 0 :(得分:1)

Mongoid延迟加载,执行:

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

附注:

  • 你应该将范围创建为lambdas,它很快就会成为Rails4的标准

  • 我在mongo中遇到了符号类型的问题(在迁移期间),我宁愿使用字符串

  • 我非常确定您的测试会失败,因为您的对象不是在db中创建的(let在被调用之前不会被评估,替换为let!