ruby on rails - Rspec - how to write a test for class method -
being new ror , rspec struggling write test scenario.
# table name: countries # # id :integer not null, primary key # code :string(255) not null # name :string(255) # display_order :integer # create_user_id :integer not null # update_user_id :integer # created_at :datetime not null # updated_at :datetime # eff_date :date # exp_date :date i want test method in country model:
def self.get_default_country_name_order countries = country.in_effect.all.where("id !=?" ,wbconstants::default_country_id).order("name") result = countries end in country_spec have this:
describe country before(:all) databasecleaner.clean_with(:truncation) end let(:user){create(:user)} let(:country3){create(:country,code:"aus", name:"australia", create_user:user, eff_date: time.new(9999,12,31), exp_date: time.new(9999,12,31))} after(:all) databasecleaner.clean_with(:truncation) end this country expired, have named scope on model filters out expired countries. test should this:
it "should not include expired country" c = country.get_default_country_name_order end is correct far? test not seem return method however?
yes, proper direction.
to fix problem persisting country models, should either change this:
let(:country3){create(:country,code:"aus", name:"australia", create_user:user, eff_date: time.new(9999,12,31), exp_date: time.new(9999,12,31))} to this:
before {create(:country,code:"aus", name:"australia", create_user:user, eff_date: time.new(9999,12,31), exp_date: time.new(9999,12,31))} or in test call :country3:
it "should not include expired country" country3 c = country.get_default_country_name_order end let(:country3) "registering" method called (in example, populates database), not performed automatically. long don't need value returned method, should stick before, execute code automatically.
on other hand, might want test returned value country model. like:
it "should not include expired country" example_country = country3 c = country.get_default_country_name_order expect(c).to eq example_country end hope helps.
good luck!
update
example of how structure spec multiple occurrences of before
describe country before(:all) databasecleaner.clean_with(:truncation) end let(:user){create(:user)} let(:country3){create(:country,code:"aus", name:"australia", create_user:user, eff_date: time.new(9999,12,31), exp_date: time.new(9999,12,31))} after(:all) databasecleaner.clean_with(:truncation) end describe "#get_default_country_name_order" # can register "before" before {create(:country,code:"aus", name:"australia", create_user:user, eff_date: time.new(9999,12,31), exp_date: time.new(9999,12,31))} # or simpler - call method # before "it", , create record # before { country3 } "should not include expired country" # expectations here end end