Posted at

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

More than 3 years have passed since last update.


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にログが出てくると嬉しいんだけど・・出てこないみたい・・・

実はやり方が悪いだけで出ますよ!とかあったら教えてください。。