19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【RSpec】コントローラーのインスタンス変数をテストで使いたいとき【assignsは非推奨】

Last updated at Posted at 2020-10-23

Rails 5 から assigns(assert_templateも)が非推奨になりました。
一応、コントローラーテスト自身はdeprecatedになっていないのでassignsは使えるのですが、rails-controller-testingというgemをインストールする必要があります。

しかし、これはあくまでも既存のプロジェクトに対する救済策で、新規のプロジェクトでassignsを使うことは推奨できません。(ぶっちゃけ理由はわからないです。わかる方いれば教えて下さい :pray: )

@jnchito さんからコメント頂きました。ありがとうございます!
簡単に言うと、Railsの生みの親が、「やめよう」といったからです。(鶴の一声??)
詳しく知りたい方はコメント欄をご覧ください :smile:

代わりに、

controller.instance_variable_get("@hoge")

というのを使うことでインスタンス変数を取得することができます。

#コード例
最近書いたパスワードリセット処理のテストを一部抜粋してきました。

password_resets_request_spec.rb
RSpec.describe 'PasswordResets', type: :request do
  let(:user) { create(:user) }

 describe 'パスワードリセット編集画面へのアクセス' do
    context '不正なメールアドレスだったとき' do
      it 'userはパスワード再設定ページへリダイレクトされること' do
        post password_resets_path, params: { password_reset: { email: user.email } }
        user = controller.instance_variable_get('@user')
        get edit_password_reset_path(user.reset_token, email: '')
        expect(flash[:danger]).to be_truthy
        follow_redirect!
        expect(request.fullpath).to eq '/password_resets/new'
      end
    end

↑のコードではreset_token属性にアクセスしたかったので、そのためにcreateアクションの@userというインスタンス変数を取得しているといった感じです。

また、こちらはもっといい書き方がある(システムスペック)ことを、 @jnchito さんから教えていただいたので、後日こちらに追記していきたいと思ってます!

#最後まで読んでいただきありがとうございます!
最近個人開発のアプリのデプロイに必死で、少し短いです :pray:
デプロイ完了したら、また記事をがっつり書いてこうと思ってます!!よろしくお願いいたします。

19
11
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?