RailsチュートリアルのテストをRspecで書いてみた[第9章]

はじめに

今回はRspecの学習の一環として、RailsチュートリアルのテストをRspecで書いていきます。
至らない点があるかもしれませんが、その際はコメントにてご指摘をお願いします。

各種バージョン

Ruby 2.7.0
Rails 6.0.3.3
Rspec 3.9
Capybara 3.33.0
Factory_bot_rails 6.1.0

第9章

リスト9.14: 2番目にウィンドウでユーザーをログアウトするテスト

spec/requests/sessions_requests_spec.rb

require 'rails_helper'

RSpec.describe "Sessions", type: :request do
  let(:user) { FactoryBot.create(:user) }
・・・
  describe "delete /logout" do
    it 'redirects to root_path' do
# 前章で「post login_path」の箇所はbeforeを使用して書いていましたが、
# 今回のテストを書くにあたり、以下の箇所に移動させました。
      post login_path, params: { session: {
        email: user.email,
        password: user.password,
      } }
      delete logout_path
      aggregate_failures do
        expect(response).to redirect_to root_path
        expect(is_logged_in?).to be_falsy
      end
    end
# 今回のテストはここからです。
    it 'succeeds logout when user logs out on multiple tabs' do
      delete logout_path
      aggregate_failures do
        expect(response).to redirect_to root_path
        expect(is_logged_in?).to be_falsy
      end
    end
  end
end

リスト9.17: ダイジェストが存在しない場合のauthenticated?のテスト

spec/models/user_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do
・・・
  it 'returns false for a user with nil digest' do
    expect(user.authenticated?('')).to be_falsy
  end
end

リスト9.25: [remember me]チェックボックスのテスト

リスト9.24: log_in_asヘルパーを追加する
spec/suport/test_helper.rb

module TestHelper
・・・
  def log_in_as(user, remember_me: '1')
    post login_path, params: { session: {
      email: user.email,
      password: user.password,
      remember_me: remember_me,
    } }
  end
end
RSpec.configure do |config|
  config.include TestHelper
end
spec/requests/sessions_requestspec.rb

require 'rails_helper'

RSpec.describe "Sessions", type: :request do
  let(:user) { FactoryBot.create(:user) }
・・・
  describe 'remember me' do
    it "remembers the cookie when user checks the Remember Me box" do
      log_in_as(user)
      expect(cookies[:remember_token]).not_to eq nil
    end
    it "does not remembers the cookie when user does not checks the Remember Me box" do
      log_in_as(user, remember_me: '0')
      e_xpect(cookies[:remember_token]).to eq nil
    end
  end
end

リスト9.31: 永続セッションのテスト

spec/helpers/sessions_helper_spec.rb

require 'rails_helper'

RSpec.describe SessionsHelper, type: :helper do
  let(:user) { FactoryBot.create(:user) }

  describe 'current_user' do
    before do
      remember(user)
    end

    it 'current_user returns right when session is nil' do
      expect(current_user).to eq user
      expect(is_logged_in?).to be_truthy
    end
    it 'current_user returns nil when remember digest is wrong' do
      user.update_attribute(:remember_digest, User.digest(User.new_token))
      expect(current_user).to eq nil
    end
  end
end