2011-01-30 13 views
17

próbował znaleźć, ale bez powodzenia. Zastanawiam się, jak mogę przetestować zakresy w Railsach 3.Jak przetestować zakresy?

Może używać rspec, shoulda lub tylko jednostki testowej.

Dzięki.

Właściwie próbuję w ten sposób, ale to nie jest kompletny test, ponieważ nadal trzeba wprowadzić metodę order().

Zakres:

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 

koniec

Odpowiedz

25

David Chelimsky (twórca rspec za) ofiarował następujący przykład w 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 

To nie jest oczywiście taki sam przykład jak ty, ale powinno dać wyobrażenie o tym, jak to zrobić. Odpowiedni wątek dla kontekstu znajduje się tutaj: http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f

4

Jestem pewien, że istnieje bardziej eleganckie rozwiązanie, ale zawsze tak skonfigurować niektóre obiekty, które powinny i nie powinny być w moim zasięgu. Po wywołaniu zakresu, sprawdzam, czy zwrócone ma obiekt, który powinien, i nie ma obiektu, którego nie powinien.

Jeśli cokolwiek, mam nadzieję, że zostaną oświecone przez inne odpowiedzi.

+0

konfigurowanie dwóch skrajnych przypadków i testowanie twojej metody (w rzeczywistości jest to zakres) jest eleganckim rozwiązaniem testowym, więc nie martw się o użycie powyższej odpowiedzi – Houen