29
21

More than 5 years have passed since last update.

RailsでコントローラーのRSpecを書いている時にパラメータを見たい(デバッグの方法)

Posted at

RSpecでController spec

Controller specをひな形生成

ファイル名やディレクトリ名、必要なrequireなど、間違えると変にハマる罠を避けるため、初心者はgeneratorを使う方が良いことに気づいた。

$ ./bin/rails g rspec:controller blogs

生成ファイル:spec/controllers/blogs_controller_spec.rb

生成されるファイルはこんな感じ。

spec/controllers/blogs_controller_spec.rb
require 'rails_helper'

RSpec.describe BlogsController, type: :controller do
end

post時のパラメータの渡し方がよくわからない・・

対象のコントローラーにpostリクエストを渡す。

post :create, パラメータの渡し方!!

パラメータの渡し方がイマイチよくわからない・・・

渡したパラメータの実際の値を確認したい

テスト用のログファイルを見ると確認出来る。

こんな感じ。下は失敗している時のログ
Parameters:が見たかったところ。

log/test.log
Processing by BlogsController#create as HTML
  Parameters: {"id"=>"62", "title"=>"My Test Blog", "created_at"=>"2015-06-24 23:06:43 UTC", "updated_at"=>"2015-06-24 23:06:43 UTC"}
...

成功したときのログ

log/test.log
Processing by BlogsController#create as HTML
  Parameters: {"blog"=>{"title"=>"My Test Blog"}}
...

特定のスペックだけ実行

ログが大量に出るので、見たかったスペックのパラメータがどれか迷子にならないように、RSpecで対象のテストだけを実行する方法

$ bundle exec rspec spec/controllers/blogs_controller_spec.rb:16

スペックのある行を:nで指定。

ログファイルの監視

$ tail -f log/test.log

パラメータの渡し方幾つかのやり方

attributes_for(:blog) を使う

post :create, blog: attributes_for(:blog)

ココで使われている attributes_for は FactoryGirlのメソッド
FactoryGirlを使っていない場合は使えない。
また、FactoryGirlの接頭辞を抜かすためにはFactoryGirlの設定が必要。

上述の設定無しで呼び出す場合は、フルネームで書く。

post :create, blog: FactoryGirl.attributes_for(:blog)

@blog.attributes を使う方法

@blog = FactoryGirl.build(:blog)
post :create, blog: @blog.attributes

あえて一度モデルを経由している状態。
この説明ではモデル生成に結局FactoryGirlを使っているので、説得力がないが、FactoryGirl無しの状態でモデルを作って渡す場合などはモデルの attributes を使うと良いみたい。

ちなみにFactoryGirl.createでモデルを生成&保存してしまうと次行の post :create と2個モデルを作ってしまうことになるので注意。

完成したテスト。こんな感じになった

spec/controllers/blogs_controller_spec.rb
  describe 'POST #create' do
    it "新規作成したらBlogが増えていること" do
      expect {
        post :create, blog: FactoryGirl.attributes_for(:blog)
      }.to change(Blog, :count).by(1)
    end
  end

(補足:自分的な注意点)FactoryGirl でモデルを生成する時に知っておくべきこと

  • FactoryGirl.create モデルを生成&保存する
  • FactoryGirl.build モデルの生成のみ(保存しない)
  • FactoryGirl.attributes_for モデルを生成してハッシュで返す(保存しない)

困ってること

ホントはguard使ってるので、guardで変更箇所だけ実行してくれたときに、log/test.logにログが出てくると嬉しいんだけど・・出てこないみたい・・・
実はやり方が悪いだけで出ますよ!とかあったら教えてください。。

29
21
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
29
21