RSpecでメソッドを通るかどうかを確認する
RSpecで、メソッドを通ったかどうかを確認する方法です。receive matcherを利用するのですが、ちょっと癖があるので注意が必要です。
/users/show/:id にアクセスした時にUserのupdated_atを更新する処理をするコードのSpecの例はこんな感じです。
[users_controller.rb]
class TourTeamsController > ApplicationController def show user = User.find params[:id] user.touch if user.present? end end
[users_controller_spec.rb]
require 'spec_helper' describe UsersController do describe ‘GET show’ do let(:user) { FactoryGirl.create :user } it { # showメソッドが呼ばれる前にreceiveのコードを書いておく必要がある expect(user).to receive(:touch) # インスタンスが定まっていない場合はこういう書き方もできる # expect_any_instance_of(User).to receive(:touch) post :show, :id => user.id } end end
気をつけなければいけないのは、receiveのコードは処理の前に書かなければいけないということです。そうしないとreceived: 0 times with any argumentsと言われてテストがこけますので注意してください。
まぁこの例の場合だと
expect{post :show, :id => user.id}.to change(user, :updated_at).from(user.updated_at)
をテストした方がいい気がしますが、メソッドを通るかどうかの確認をする場合はreceiveをうまく使ってみましょう。