Rspec没有路由匹配,检查控制器中的flash消息

时间:2016-01-17 00:33:37

标签: ruby-on-rails rspec

我需要测试在引发特定异常时出现flash消息。我收到了无路由匹配错误,并通过" Rspec控制器测试,无路由匹配"查看了其他主题。我仍然不确定是什么问题。这是我第一次写rspec测试。注释掉的行是尝试通过的各种其他尝试。

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 is in use and cannot be    deleted"
  else
    raise e
  end
end

business_controller_spec.rb:

require "spec_helper"

describe Audit::BusinessesController do

describe "handling ActiveRecord::StatementInvalid" do
 before {delete, url = 'audit/jurisdictions/:jurisdiction_id/businesses/:id(.:format)'} 
 it "should rescue with a flash message" do
#     /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 is in use and cannot be deleted")
 end
 end
end

rake routes:

audit_businesses GET       
/audit/jurisdictions/:jurisdiction_id/businesses(.:format)                                                           

audit/businesses#
POST    /audit/jurisdictions/:jurisdiction_id/businesses(.:format)                                                           

audit/businesses#create
new_audit_business GET     
/audit/jurisdictions/:jurisdiction_id/businesses/new(.:format)                                                        

audit/businesses#new
  edit_audit_business GET    

/audit/jurisdictions/:jurisdiction_id/businesses/:id/edit(.:format)                                                    
audit/businesses#edit
audit_business 
GET    /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

错误讯息:

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)>'

当我将规格更改为:

describe Audit::BusinessesController do

 describe "handling ActiveRecord::StatementInvalid" do
   it "should rescue with a flash message" do
     put :update, :jurisdiction_id => 1, :id => 1, :format => html
     expect(controller).to set_flash[:alert].to(/This account number is in use and cannot be deleted/).now

错误是:

Failure/Error: put :update, :jurisdiction_id => 1, :id => 1, :format => html
 NoMethodError:
   undefined method `can_update?' for nil:NilClass

routes.rb中:

  namespace :audit do
root to: 'site#home'

resources :labels,        only: ['index', 'destroy'] do
  post 'delete_queue', on: :collection
  get 'print',         on: :collection
  get 'print_view',    on: :collection
  get 'mark_printed',  on: :collection
  get '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 do
  get 'search'
end

get  'intro_letter_search' => 'files#intro_letter_search'
put  'intro_letter_update' => 'files#intro_letter_update'
get  'search'           => 'files#search'
get  'calendar'         => 'files#calendar'
get  'autocomplete'     => 'files#autocomplete'
get  'direct'           => 'files#direct'

get  'size_code_select' => 'businesses#size_code_select'

scope '/jurisdictions/:jurisdiction_id' do
  resources :businesses, controller: 'businesses'
  resources :files,      controller: 'files' do 
    get 'print',         on: :member
  end
    # get 'page/:page', action: :index, on: :collection
end
end

2 个答案:

答案 0 :(得分:1)

用于rspec测试而不是写

期望(页面).to have_content(&#34; flash message&#34;)

其中&#34; flash消息&#34;是您尝试通过的错误或例外的实际消息。例如,flash [:notice] =&#34;发生错误&#34;,你会把have_content(&#34;发生错误&#34;)

希望有帮助吗?!

贾斯汀

答案 1 :(得分:0)

@TzokinB - 我相信“Capybara :: ElementNotFound:无法找到xpath”/ html“通常意味着测试集现在正在寻找一个视图。你是否已将一个视图与控制器中的动作相关联?