0

スコープを使用して次の 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>

では、このスコープをテストするにはどうすればよいでしょうか?

4

1 に答える 1

1

Mongoid 遅延読み込み、次のようにします。

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

補足:

  • スコープをラムダとして作成する必要があります。Rails4 では間もなく標準になります。

  • mongo のシンボル タイプに問題がありました (移行中)。むしろ文字列を使用したいと思います

  • オブジェクトがdbで作成されていないため、テストが失敗することは間違いありません(let呼び出されるまで評価されず、に置き換えられlet!ます)

于 2013-02-21T09:21:11.763 に答える