Help us understand the problem. What is going on with this article?

Railsチュートリアルの第4版をRSpecでテスト-3

More than 1 year has passed since last update.

Ruby on Rails チュートリアルの第4版を学習し、Everyday Rails - RSpecによるRailsテスト入門でRSpecを学習したので、Ruby on Rails チュートリアルをRSpecでテストしてみました。
今回は第9章のテストを書きます。
第3章~第8章のテストは以下にあります。
Railsチュートリアルの第4版をRSpecでテスト-1(第3章~第6章)
Railsチュートリアルの第4版をRSpecでテスト-2(第7章~第8章)

2つの目立たないバグのテスト

Remember me(ログイン時にログイン情報を記憶する)テストを書く前に、Ruby on Rails チュートリアル(第4版)の9.1.4 2つの目立たないバグ についてテストします。
まず、ログイン中の場合のみログアウトすることをテストするために、spec/requests/remember_me_spec.rbを作成し以下を追記します。

spec/requests/remember_me_spec.rb
require 'rails_helper'

RSpec.describe "Remember me", type: :request do
  let(:user) { FactoryBot.create(:user) }

  # 2つのバグのテスト1
  context "with valid information" do
    # ログイン中のみログアウトすること
    it "logs in with valid information followed by logout" do
      sign_in_as(user)     # spec/support/utilities.rbに定義
      expect(response).to redirect_to user_path(user)

      # ログアウトする
      delete logout_path
      expect(response).to redirect_to root_path
      expect(session[:user_id]).to eq nil

      # 2番目のウィンドウでログアウトする
      delete logout_path
      expect(response).to redirect_to root_path
      expect(session[:user_id]).to eq nil
    end
  end
end

ここで、sign_in_asメソッドはRailsチュートリアルの第4版をRSpecでテスト-2で定義したものです。
テストを実行しパスするのを確認します。

続いて、ユーザーが複数のブラウザでログインしていた時のテストをspec/models/user.rbに追加します。

spec/models/user.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  let(:user) { FactoryBot.create(:user) }

  # 途中のテストは省略

  # 2つのバグのテスト2
  describe "authenticated? should return false for a user with nil digest" do
    # ダイジェストが存在しない場合のauthenticated?のテスト
    it "is invalid without remember_digest" do
      expect(user.authenticated?(:remember, '')).to eq false
    end
  end
end

テストを実行しパスするのを確認します。

[Remember me]のテスト

[Remember me]機能が正しく動作しているか確認するテストをspec/requests/remember_me_spec.rbに追加します。

spec/remember_me_spec.rb
require 'rails_helper'

RSpec.describe "Remember me", type: :request do
  let(:user) { FactoryBot.create(:user) }

  # 途中のテストは省略

  # remember_meチェックボックスのテスト
  context "login with remembering" do
    it "remembers cookies" do
      post login_path, params: { session: { email: user.email,
                                      password: user.password,
                                      remember_me: '1'} }
      expect(response.cookies['remember_token']).to_not eq nil
    end
  end 

  context "login without remembering" do
    it "doesn't remember cookies"do
      # クッキーを保存してログイン
      post login_path, params: { session: { email: user.email,
                                      password: user.password,
                                      remember_me: '1'} }
      delete logout_path
      # クッキーを保存せずにログイン
      post login_path, params: { session: { email: user.email,
                                      password: user.password,
                                      remember_me: '0'} }
      expect(response.cookies['remember_token']).to eq nil
    end
  end
end

ここで、ログイン状態のシミュレートにはspec/support/utilities.rbに定義したsign_in_asメソッドを使いたかったのですが、キーワード引数を設定すると上手くいかなかったのでpost login_pathでログインを使いました。

今回は以上です。
10章以降は完成し次第書いていきます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした