ruby on rails - Sign in user without creating multiple users in rspec -
using rspec , devise, i'm able sign in user
run tests. however, i've come across problem method because using before :each
causing multiple users created, causes tests break.
should change method of testing? or change method of signing in user?
campaign_controller_spec.rb
before :each @user = factorygirl.create(:user) sign_in :user, @user @business = factorygirl.create(:business, user: @user) end describe "get #index" before :each factorygirl.create(:active_campaign, business: @business) factorygirl.create(:inactive_campaign, business: @business) end "no status or type filter" :index # <- line 22 of error expect(assigns(:campaigns).size).to eq 2 end 'status filter' :index, status: 'active' expect(assigns(:campaigns).size).to eq 1 end end
campaigns_controller.rb
def index # current user's campaigns @campaigns = current_user.business.campaigns # filter status (constraints in routes) @campaigns = @campaigns.send(params[:status]) unless params[:status] == 'all' # <- line 7 of error end
the problem of campaigns belong business
belong user-1 in spec, in controller, campaigns belong user (because several being created) doesn't have campaigns associated.
the exact error is:
1) campaignscontroller [signed in] #index no status or type filter failure/error: :index typeerror: nil not symbol nor string # ./app/controllers/campaigns_controller.rb:7:in `index' # ./spec/controllers/campaigns_controller_spec.rb:22:in `block (4 levels) in <top (required)>'
small update
i have database cleaner
gem installed, should clear db between tests. here config (just in case incorrect):
#databasecleaner config.before(:suite) databasecleaner.strategy = :transaction databasecleaner.clean_with(:truncation) end config.before(:each) databasecleaner.start end config.after(:each) databasecleaner.clean end
when using factory_girl
you'll want use database_cleaner
gem clean database between tests. check out:
https://github.com/databasecleaner/database_cleaner#user-content-rspec-example
edit:
realized error isn't caused think it's caused. it's because you're doing .send(params[:status])
when params[:status]
nil because it's not passed in on call get :index
... once .send(nil)
invoked stack trace.
Comments
Post a Comment