KonifarPod

RSpecでメソッドを通るかどうかを確認する

   

Pocket

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をうまく使ってみましょう。

Pocket

 - Develop ,