How to test scopes?
Asked Answered
B

2

17

tried to find but with no success. Just wondering how could I test scopes in Rails 3.

Could be using rspec, shoulda or just a test unit.

Thanks.

Actually, I trying this way, but it's not complete test since it's still need to put the order() method.

The Scope:

scope :recents_available, where(:available => true, :locked => false).order("created_at DESC")

describe Job, ":recents_available" do

it "should have the scope" do
  Job.should respond_to(:recents_available)
end

it "should include recents jobs that are available and unlocked" do
  @job = Factory(:job, :available => true, :locked => false  )      
  Job.recents_available.should include(@job)
end

end

Beckerman answered 30/1, 2011 at 1:20 Comment(0)
M
24

David Chelimsky (Rspec's creator) offered up the following example in the Rspec Google Group:

describe User, ".admins" do 
  it "includes users with admin flag" do 
    admin = User.create! :admin => true 
    User.admin.should include(admin) 
  end

  it "excludes users without admin flag" do 
    non_admin = User.create! :admin => false 
    User.admin.should_not include(non_admin) 
  end 
end

class User < ActiveRecord::Base 
  named_scope :admins, :conditions => {:admin => true} 
end 

It's obviously not the same example as yours, but it should give you an idea of how to do it. The relevant thread for context is here: http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f

Menticide answered 18/3, 2011 at 12:30 Comment(0)
A
4

I'm sure there's a more elegant solution, but I've always just set up some objects that should and shouldn't be in my scope. After calling the scope, I check that the returned has the object that it should, and doesn't have the object that it shouldn't.

If anything, I hope to be enlightened by other answers.

Arenicolous answered 30/1, 2011 at 1:28 Comment(1)
setting up two edge cases and testing your method (which is what scope really is) is an elegant test solution, so dont worry about using the above answerGitagitel

© 2022 - 2024 — McMap. All rights reserved.