概要
routingでtypoしていると、railsは無視して解釈してアクセスできるようにしてくれますが、rspecはそのコントローラーのテストでエラーを返します。
例えば
config/routes.rb
resources :examples, excpet: %i[new update destroy]
exceptをexcpet
のように書く。
こんな感じで解決される。
ちなみにrails routesはこんな感じになる
examples GET /examples(.:format) examples#index {:excpet=>[:new, :update, :destroy]}
POST /examples(.:format) examples#create {:excpet=>[:new, :update, :destroy]}
new_example GET /examples/new(.:format) examples#new {:excpet=>[:new, :update, :destroy]}
edit_example GET /examples/:id/edit(.:format) examples#edit {:excpet=>[:new, :update, :destroy]}
example GET /examples/:id(.:format) examples#show {:excpet=>[:new, :update, :destroy]}
PATCH /examples/:id(.:format) examples#update {:excpet=>[:new, :update, :destroy]}
PUT /examples/:id(.:format) examples#update {:excpet=>[:new, :update, :destroy]}
DELETE /examples/:id(.:format) examples#destroy {:excpet=>[:new, :update, :destroy]}
routingではtypoは解釈されず、resourcesは全て解釈される。
そしてcontrollerを作りアクセスすると
examples_controller.rb
class ExamplesController < ApplicationController
def index
end
{"method":"GET","path":"/examples","format":"html","controller":"ExamplesController","action":"i
ndex","status":200,"duration":4429.18,"view":4345.9,"db":3.32,"backtrace":null,"host":"localhost
","message":"[200] GET /terms_of_uses (TermsOfUsesController#index)"}
そして普通にアクセスできてしまう。
しかしこの状態でrspecのcontroller_specを作成して実行すると
require "rails_helper"
RSpec.describe ExamplesController, type: :controller do
describe "GET #index" do
it "returns a 200 status code" do
get :index
expect(response.status).to eq(200)
end
end
end
spec/controller/exmaples_spec.rb
1) AnnouncementsController GET #index responds successfully with an HTTP 200 status code
Failure/Error: get :index
ActionController::UrlGenerationError:
No route matches {:action=>"index", :controller=>"announcements"}
# /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:35:in `block in process'
# /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:102:in `catch'
# /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:102:in `_catch_warden'
# /usr/local/bundle/gems/devise-4.7.1/lib/devise/test/controller_helpers.rb:35:in `process'
# ./spec/controllers/youtube_channel_platform_histories_controller_spec.rb:58:in `block (3 levels) in <top (required)>'
このように解釈してくれない。
結論
typoするやつ許すまじ(ブーメラン)