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