はじめに
Everyday Railsで学習中、save_and_open_page
というメソッドが出てきました。
テストにおけるデバッグ方法をあまり知らなかったので調べてみました。
環境
ruby 3.2.1
Rails 7.0.4
rspec-rails 6.0.1
Capybara 3.38.0
launchy 2.5.2
device 4.9.0
save_and_open_pageとは
これはCapybaraのメソッドで、任意の箇所にsave_and_open_page
と記述することでページのスクリーンショットを撮り、ブラウザで確認できます。
テストに失敗した時、どの部分に問題があるのかを検証する事ができます。
使い方
例えば、ホーム画面ヘアクセスするにはログインが必要だとします。
class HomeController < ApplicationController
before_action :authenticate_user!
def home
end
end
うっかりログインせずにhomeページへ遷移するテストをしたとします。
require 'rails_helper'
RSpec.describe "Homes", type: :system do
before do
driven_by(:rack_test)
end
describe "#index" do
context "ログイン済みユーザーの場合" do
before do
@user = FactoryBot.create(:user)
end
it "homeページを表示できる" do
visit root_path
expect(page).to have_current_path root_path
end
end
end
end
しかしいけません。ログインしていないのでエラーが発生しました。
Homes
#index
ログイン済みユーザーの場合
homeページを表示できる (FAILED - 1)
Failures:
1) Homes #index ログイン済みユーザー homeページを表示できる
Failure/Error: expect(page).to have_current_path root_path
expected "/users/sign_in" to equal "/"
# ./spec/system/homes_spec.rb:15:in `block (4 levels) in <top (required)>'
Finished in 0.36835 seconds (files took 1.81 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/system/homes_spec.rb:13 # Homes #index ログイン済みユーザー homeページを表示できる
そんなときはsave_and_open_page
メソッドでデバッグです。
# RSpec.describeブロックは省略...
describe "#index" do
context "ログイン済みユーザーの場合" do
before do
@user = FactoryBot.create(:user)
end
it "homeページを表示できる" do
visit root_path
save_and_open_page #追記
expect(page).to have_current_path root_path
end
end
end
テストを実行するとエラー分が変わり、スクリーンショットのパスが表示されます。
Homes
#index
ログイン済みユーザー
File saved to /Users/name/tutorial/environment/rspectutorial \
/tmp/capybara/capybara-202303152034186588149655.html.
Please install the launchy gem to open the file automatically.
homeページを表示できる (FAILED - 1)
Failures:
#以下省略...
パスをブラウザで開くと、homeページではなくログイン画面が表示されています。
このことから、ユーザーのログインを忘れていた事がわかります。
しかし、毎回パスをブラウザに貼り付けて...とするのは少々面倒くさいです。
そんなときはlaunchy
というgemを使用すると、自動でブラウザを開いてくれるようになります。
launchy
gem "launchy"