RSpecでController spec
Controller specをひな形生成
ファイル名やディレクトリ名、必要なrequireなど、間違えると変にハマる罠を避けるため、初心者はgeneratorを使う方が良いことに気づいた。
$ ./bin/rails g rspec:controller blogs
生成ファイル:spec/controllers/blogs_controller_spec.rb
生成されるファイルはこんな感じ。
require 'rails_helper'
RSpec.describe BlogsController, type: :controller do
end
post時のパラメータの渡し方がよくわからない・・
対象のコントローラーにpostリクエストを渡す。
post :create, パラメータの渡し方!!
パラメータの渡し方がイマイチよくわからない・・・
渡したパラメータの実際の値を確認したい
テスト用のログファイルを見ると確認出来る。
こんな感じ。下は失敗している時のログ
Parameters:が見たかったところ。
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"}
...
成功したときのログ
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個モデルを作ってしまうことになるので注意。
完成したテスト。こんな感じになった
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にログが出てくると嬉しいんだけど・・出てこないみたい・・・
実はやり方が悪いだけで出ますよ!とかあったら教えてください。。