ActionController:: RoutingError в Rspec eventhough контроллер и действие существуют
Я столкнулся с проблемой с Rspec при написании тестов для моего контроллера авторизации Omniauth.
Вот мои маршруты.rb
MyWebApp::Application.routes.draw do
get "static/index"
match "login" => 'user_sessions#new'
match 'logout' => 'user_sessions#destroy'
match "api" => "api#content", :via => :get
match "api/node_tree" => "api#node_tree", :via => :get
match "/auth/:provider/callback" => "oauth_authorizations#create"
match "/auth/failure" => "oauth_authorizations#failure"
match "/auth/:provider" => "oauth_authorizations#blank"
resources :users do
resources :apps do
resources :nodes
end
end
resources :user_sessions
end
Oauth_authorization_controller_spec.rb
it "should create a new authorization entry for the user" do
expect {get :create }.to change(Authorization, :count).by(1)
end
Oauth_authorization_controller.rb
class OauthAuthorizationsController < ApplicationController
def create
end
end
Когда я запускаю свою спецификацию, я получаю следующую ошибку
Failures:
1) OauthAuthorizationsController when a current user session already exists should create a new authorization entry for the user
Failure/Error: expect {get :create }.to change(Authorization, :count).by(1)
ActionController::RoutingError:
No route matches {:controller=>"oauth_authorizations", :action=>"create"}
Не мог бы кто-нибудь помочь мне выяснить, в чем причина этого, потому что, как ясно из кода контроллера, {: controller=> " oauth_authorizations", : action= > "create"} существует.
2 ответа:
Попробуйте заменить глагол get http на post:
expect {post :create }.to change(Authorization, :count).by(1)
Проблема заключалась в том, что параметр provider, указанный в маршруте,
match "/auth/:provider/callback" => "oauth_authorizations#create"
Не был пройден тест.
Прохождение его исправило тест.
get :create, :provider => omniauth_hash['provider']
Таким образом, тест будет переписан как.
it "should create a new authorization entry for the user" do expect {get :create, provider => omniauth_hash['provider'] }.to change(Authorization, :count).by(1) end
Может быть, это кому-то поможет.