0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RSpecにおけるデバッグ方法 `save_and_open_page`

Posted at

はじめに

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と記述することでページのスクリーンショットを撮り、ブラウザで確認できます。
テストに失敗した時、どの部分に問題があるのかを検証する事ができます。

使い方

例えば、ホーム画面ヘアクセスするにはログインが必要だとします。

app/controllers/home_controller.rb
class HomeController < ApplicationController

  before_action :authenticate_user!

  def home
  end
end

うっかりログインせずにhomeページへ遷移するテストをしたとします。

spec/system/homes_spec.rb
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メソッドでデバッグです。

spec/system/homes_spec.rb
# 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ページではなくログイン画面が表示されています。
このことから、ユーザーのログインを忘れていた事がわかります。
スクリーンショット 2023-03-15 20.57.34.png

しかし、毎回パスをブラウザに貼り付けて...とするのは少々面倒くさいです。
そんなときはlaunchyというgemを使用すると、自動でブラウザを開いてくれるようになります。

launchy

Gemfile
gem "launchy"

参考サイト

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?