2017-02-27 35 views
0

我嘗試測試我的RoR應用程序。當我測試造成的ActionController :: RoutingError在我的控制器我獲得以下錯誤: 了1個衰竭等1個錯誤:預計ActionController :: RoutingError,但沒有給出在rails應用程序中的塊rspec

2.1) Failure/Error: expect(visit meters_path).to raise_error(ActionController::RoutingError) 
     expected ActionController::RoutingError but was not given a block 
     # ./spec/integration/meter_behavior_spec.rb:70:in `block (2 levels) in <top (required)>' 

2.2) Failure/Error: raise ActionController::RoutingError.new('Not Found') 

     ActionController::RoutingError: 
     Not Found 

的原因是什麼? 這是我的測試寶石列表:

group :development, :test do 
    gem 'factory_girl_rails' 
    gem 'faker' 
    gem 'rspec-rails' 
end 
group :test do 
    gem 'capybara' 
    gem 'database_cleaner' 
    gem 'launchy' 
    gem 'selenium-webdriver', '2.53.4' 
    gem 'capybara-webkit' 
    gem 'shoulda-matchers', '~> 3.1' 
end 

我的規格文件

meter_behavior_spec.rb

scenario 'a visitor cannot to view meters pages', driver: :webkit do 
    user = FactoryGirl.create(:client1) 
    user.meters.create(attributes_for(:meter))   
    expect(visit meters_path).to raise_error(ActionController::RoutingError) 
    end 

meters_controller.rb:

before_action only: :index do 
    access_allowed_for(['Client']) 
    end 
    # GET /meters 
    # GET /meters.json 
    def index 
    respond_to do |format| 
     format.json { render json: MetersDatatable.new(view_context, current_user) } 
     format.html 
    end 
    end 

application_controller.rb:

def access_allowed_for(statuses_ary=[]) 
    statuses_ary << 'Admin' 
    if !user_signed_in? || statuses_ary.exclude?(current_user.try(:status)) 
     raise ActionController::RoutingError.new('Not Found') 
    end 
    end 

回答

1

Jean-Christophe的回答指出的第一個問題是匹配器需要一個塊。第二個問題是你正在測試一些在控制器測試(而不是水豚驅動)中測試的東西,而不是功能測試。

如果你堅持在功能測試來測試該再有就是你需要驗證

  1. 讓幾件事情肯定你沒有在測試環境中被捕獲的錯誤併產生任何寶石很好/詳細的錯誤頁面。這將包括像web_console,better_errors等寶石。這些寶石應該只在開發環境中。

  2. 確保您已在您的測試配置

  3. 您可能需要添加塊內的第二水豚語句設置Capybara.raise_server_errors = true。這是因爲Capybara在與測試分開的線程中運行應用程序,並且訪問調用可能異步發生(取決於您使用的驅動程序)。這意味着訪問電話返回時實際上可能沒有發生錯誤。通過向水豚方法添加第二個調用,它將稍等一會,以完成訪問,然後檢測服務器/應用程序線程中是否出現錯誤,並在測試線程中重新提出該錯誤。

    expect{ 
        visit meters_path 
        page.has_text? 'Random text' # only here to give time for app to raise error 
    }.to raise_error(ActionController::RoutingError) 
    
+1

1我檢查了我的'web-console'和'更好的錯誤'gem在我的gemfile中,但都在'development'組中。 2然後我將'Capybara.raise_server_errors = true'字符串添加到'spec/support/capybara.rb'文件中,但又得到了錯誤。 3最後,我添加了'page.has_text?'語句,它有所幫助。謝謝。 –

+0

當我評論'Capybara.raise_server_errors = true'字符串時,測試一切正常。 –

+0

@ЭрикКеубасов是的 - 它默認爲true,我只是想確保你沒有將它重置爲false。 –

1

我相信你應該簡單地通過參觀會晤ers_path作爲一個塊,而不是作爲一個參數,像這樣:

expect{visit meters_path}.to raise_error(ActionController::RoutingError) 

參見:

https://www.relishapp.com/rspec/rspec-expectations/v/2-2/docs/matchers/expect-error

告訴我,如果它的工作原理。

+0

感謝,但它並沒有幫助。我糾正並得到類似的錯誤:1.1)失敗/錯誤:期望{訪問米_路徑} .to raise_error(ActionController :: RoutingError) 預期ActionController :: RoutingError但沒有提出 1.2)失敗/錯誤:raise ActionController :: RoutingError.new('Not Found') –

+0

好的,它仍然朝着正確的方向發展。第一次失敗是在你正在測試的代碼中,而不是你的測試代碼。如果您在控制器操作或access_allowed_for方法(不在您的條件範圍內)自動引發錯誤,測試是否會通過。這將排除任何問題與提高自己。至於你的情況,你的:client1工廠給你的用戶什麼狀態? ('client'?'Client'?) –

+0

當我在控制器中引發錯誤時,我收到類似的失敗/錯誤消息。客戶端1具有「客戶端」狀態。不管怎樣,謝謝你。 –

相關問題