LoginSignup
8
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-01-20

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章以降は完成し次第書いていきます。

追記

第10章以降のテストを書きました。
- Railsチュートリアルの第4版をRSpecでテスト-4(第10章)
- Railsチュートリアルの第4版をRSpecでテスト-5(第11章)
- Railsチュートリアルの第4版をRSpecでテスト-6(第12章)

8
6
0

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
8
6