RSpec: Helper の current_user を使ったメソッドのテスト


Rails の Helper(ヘルパー) に書いた current_user を使ったメソッドを RSpec でテストするときのやり方を書きます。

環境

  • Ruby 2.2.2
  • Rails 4.1.8
  • RSpec 3.1.0

テスト対象

テストの対象となるメソッドは次のメソッドです。

gem devise で用意されている current_user と、 引数で渡された user_id を比較して、 ログインしているユーザなのか否かを判定しています。

エラーの出るテストコード

次のコードはエラーが出ます、 単純にメソッドを呼んでいるだけで特別なことはしていないのですが。

問題点

  • Helper 内 で使用される current_userundefined method になってしまう。

HelperView(ビュー) 内 で使用する場合は エラーなく実行できるのですが、 RSpec のテストとなると undefined method になってしまいます。

Devise::TestHelper を読み込んでもエラーが出ます。 current_user が使用する @current_user を直接変更してもエラーが出ます (undefined method なので @current_user にも到達できません) 。

通るテストコード

次のように、 stub(スタブ) を利用してテストを通します。

stub を利用して helpercurrent_user が呼ばれたときに user を返すようにしています。

Stub の書き方に注意

Stubhelper.stub(:current_user).and_return(true) のようにして作成すると RSpec 3.3 では WARNING(警告) が表示されます。 そのような書き方は 現在では非推奨になっているため、次のメッセージが表示されます。

Using stub from rspec-mocks’ old :should syntax without explicitly enabling the syntax is deprecated. Use the new :expect syntax or explicitly enable :should instead.