はじめに
RailsでRSpecを使用してcontrollerのテスト時のエラー NoMethodError: undefined method `get' for xxx について
目次
Rspecでのバージョンの違い
Rspec3以降ではデフォルトでファイルの場所から自動的に推測する機能がなくなっています。
Rspec3以降ではcontorollerのテストをする時は指定する必要があるようです。
エラーの原因
1.typeを指定していない(今回の私)
# type: :controller または type: :request とする必要あり
RSpec.describe Api::V1::PostsController, type: :controller do
describe '#index' do
・
・
・
end
end
バージョンの違いで説明した通りtypeの指定が必要となります。テキストを確認しながら進めていたときはViewのテストしかなく、contollerでtypeを指定すると知らなかったので躓きました。
注意点として、contorollerの記述方法です。Api::V1::PostsController
どこの階層にあるかによって記載方法が違います。
私は自分のcontrollerの一番上のクラス部分を貼り付けました。
class Api::V1::PostsController < ApplicationController
2.specファイルにrails_helperを読み込んでいない
テストファイルにrails_helperを読み込ませる必要があります。
posts_spec.rb
require 'rails_helper'
RSpec.describe Api::V1::PostsController, type: :controller do
rails_helperファイルには
・本番環境の時にテーブルに格納されているデータの全削除を防ぐ設定
abort("The Rails environment is running in production mode!") if Rails.env.production?
・migrationを確認(schemaとmigationに差異がある場合は例外が発生)
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
・テスト後にテストデータを削除してくれる設定
config.use_transactional_fixtures = true
・ファイルに応じたメソッドを使える設定(contorollerの場合はgetなど)
config.infer_spec_type_from_file_location!
などがあります。これを読み込むことによってgetメソッドなどが使えるので、NoMethodError: undefined method `get' for xxxx
などのエラーの場合はrails_heper
が読み込まれていない可能性があります。