LoginSignup
0
0

More than 1 year has passed since last update.

RSpecのControllerテストでNoMethodError: undefined method `get' for xxxx と表示される

Last updated at Posted at 2022-01-18

はじめに

RailsでRSpecを使用してcontrollerのテスト時のエラー NoMethodError: undefined method `get' for xxx について

目次

  1. Rspecでのバージョンの違い
  2. エラーの原因
  3. 参考文献

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が読み込まれていない可能性があります。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0