ruby on rails - Rspec no route matches, checking for flash message in controller -
i need test flash message comes when specific exception raised. getting no route matches error , have looked through other topics "rspec controller test, no routes matches" , still not sure wrong. first time writing rspec test. commented out lines various other attempts test pass.
audit/businesses_controller.rb:
class audit::businessescontroller < applicationcontroller # put /audit/businesses/:id def update remove_deleted_account_numbers_in(params) @business = @jurisdiction.businesses.find(params[:id]) @business.changed_by = current_user if @business.update_attributes(audit_business_params) success_message('update') else @business.initialize_accounts @business = @business render :edit, alert: t('flash.save_failed') end rescue activerecord::statementinvalid => e if e.message.include? "foreign key constraint" @business = @jurisdiction.businesses.find(params[:id]) @business.initialize_accounts @business = @business render :edit, alert: "this account number in use , cannot deleted" else raise e end end business_controller_spec.rb:
require "spec_helper" describe audit::businessescontroller describe "handling activerecord::statementinvalid" before {delete, url = 'audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format)'} "should rescue flash message" # /audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format) # delete, businesses_id: '80776', jurisdiction_id: '795', format: 'html', id: "234769" expect(page).to have_content("this account number in use , cannot deleted") end end end rake routes:
audit_businesses /audit/jurisdictions/:jurisdiction_id/businesses(.:format) audit/businesses# post /audit/jurisdictions/:jurisdiction_id/businesses(.:format) audit/businesses#create new_audit_business /audit/jurisdictions/:jurisdiction_id/businesses/new(.:format) audit/businesses#new edit_audit_business /audit/jurisdictions/:jurisdiction_id/businesses/:id/edit(.:format) audit/businesses#edit audit_business /audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format) audit/businesses#show put /audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format) audit/businesses#update delete /audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format) audit/businesses#destroy error message:
failure/error: before { delete audit_business_path(:jurisdiction_id, :id, :format) } actioncontroller::routingerror: no route matches {:controller=>"audit/businesses", :action=>"/audit/jurisdictions/jurisdiction_id/businesses/id.format"} # ./spec/controllers/businesses_controller_spec.rb:6:in `block (3 levels) in <top (required)>' when change spec to:
describe audit::businessescontroller describe "handling activerecord::statementinvalid" "should rescue flash message" put :update, :jurisdiction_id => 1, :id => 1, :format => html expect(controller).to set_flash[:alert].to(/this account number in use , cannot deleted/).now the error is:
failure/error: put :update, :jurisdiction_id => 1, :id => 1, :format => html nomethoderror: undefined method `can_update?' nil:nilclass routes.rb:
namespace :audit root to: 'site#home' resources :labels, only: ['index', 'destroy'] post 'delete_queue', on: :collection 'print', on: :collection 'print_view', on: :collection 'mark_printed', on: :collection 'users', on: :collection end resources :auditor_goals resources :contracts resource :contract_work, only: %w[show update], controller: 'contract_work' resources :manpower resource :county_budgets, only: :update 'search' end 'intro_letter_search' => 'files#intro_letter_search' put 'intro_letter_update' => 'files#intro_letter_update' 'search' => 'files#search' 'calendar' => 'files#calendar' 'autocomplete' => 'files#autocomplete' 'direct' => 'files#direct' 'size_code_select' => 'businesses#size_code_select' scope '/jurisdictions/:jurisdiction_id' resources :businesses, controller: 'businesses' resources :files, controller: 'files' 'print', on: :member end # 'page/:page', action: :index, on: :collection end end
for rspec test instead write
expect(page).to have_content("flash message")
where "flash message" actual message of error or exception you're trying make pass. eg for, flash[:notice] = "an error occurred", put have_content("an error occurred")
hope helps?!
justin
Comments
Post a Comment