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 2

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

Может быть, это кому-то поможет.