📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

kurasus_controller の system spec - 不定期刊 Rails App を作る(21)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。

integration_test が終わったので,system spec によるフルスタックテストを実施する. 今回も,TechRacho の Rails 5.1以降のシステムテストをRSpecで実行する(翻訳) を参考に処理を進める.

Gemfile の設定
  1. Gemfile に capybara, selenium-webdriver, chromedriver-helper を追加する.
    group :development, :test do
      # Capybara system testingとselenium driverのサポートを追加
      gem 'capybara'
      gem 'selenium-webdriver'
      # Chromeでのシステムテスト実行に使うchromedriverを簡易インストール
      gem 'chromedriver-helper'
      (中略)
    end
  2. chromedriver を homebrew でインストールしておく(Techracho の記事では brew install chromedriver となっているが,その後 cask に移動したらしい).
    brew cask install chromedriver
  3. bundle してインストールする(2行目以降は結果).
    Fetching io-like 0.3.0
    Fetching public_suffix 3.0.3
    Fetching regexp_parser 1.3.0
    Installing io-like 0.3.0
    Installing regexp_parser 1.3.0
    Installing public_suffix 3.0.3
    Fetching rubyzip 1.2.2
    Installing rubyzip 1.2.2
    Fetching archive-zip 0.11.0
    Installing archive-zip 0.11.0
    Fetching childprocess 0.9.0
    Fetching addressable 2.5.2
    Installing childprocess 0.9.0
    Installing addressable 2.5.2
    Fetching xpath 3.2.0
    Fetching selenium-webdriver 3.141.0
    Installing xpath 3.2.0
    Fetching chromedriver-helper 2.1.0
    Fetching capybara 3.11.1
    Installing chromedriver-helper 2.1.0
    Installing selenium-webdriver 3.141.0
    Installing capybara 3.11.1
  4. system_spec の場合に,selenium_chrome_headless を常に利用するように spec/spec_helper.rb に設定を追加する.
    RSpec.configure do |config|
      config.before(:each, type: :system) do
        driven_by :selenium_chrome_headless
      end
      (後略)
    end
クラスに関連するテスト
  1. まず,system spec を保存するフォルダを作成する.
    mkdir -p spec/system
  2. クラスの作成,編集,削除,表示についてテストを行う.以下のようなイベントが処理できる.
    • visit path: path に飛ぶ.
    • click_on 'リンク名': リンク名をクリックする.
    • page.driver.browser.switch_to.alert.accept: アラート画面の accept をクリックする.
    • expect(page).to have_content '文字列': 文字列が画面に書かれていることを確認する.
    • expect(page).not_to have_content '文字列': 文字列が画面に書かれていないことを確認する.
    require 'rails_helper'
    
    RSpec.describe :Kurasus, type: :system do
      include Devise::Test::IntegrationHelpers
      teacher_login :hkob
    
      it 'クラスを作成できること' do
        visit kurasus_path
        click_on '編集モードに入る'
        click_on 'クラス作成'
        fill_in 'クラス名', with: '2300'
        click_on '登録'
        expect(page).to have_content 'クラスを登録しました.'
      end
    
      context '2300 クラスが存在する時' do
        let!(:kurasu) { kurasu_factory :hkob2300 }
        it 'クラスを編集できること' do
          visit kurasus_path
          click_on '編集モードに入る'
          click_on 'クラス編集'
          fill_in 'クラス名', with: '3300'
          click_on '更新'
          expect(page).to have_content 'クラスを更新しました.'
          expect(page).to have_content '3300'
        end
    
        it 'クラスを削除できること' do
          visit kurasus_path
          click_on '編集モードに入る'
          click_on 'クラス削除'
          page.driver.browser.switch_to.alert.accept
          expect(page).to have_content 'クラスを削除しました.'
          expect(page).not_to have_content '2300'
        end
    
        it 'クラスを表示できること' do
          visit kurasus_path
          click_on 'クラス表示'
          expect(page).to have_content '2300'
        end
      end
    end
  3. この状態だと guard が止まってしまった.guard を止めて,bin/rspec を実行するとやはり止まってしまう.
  4. spring と相性が悪いのかもしれないので,Guardfile の bin/spring を bundle exec rspec に変更した.
    guard :rspec, cmd: "bundle exec rspec" do
  5. この結果,以下のような system spec の結果になった.puma が起動し,Capybara でテストが実行されていることがわかる.
    Kurasus
    Capybara starting Puma...
    * Version 3.12.0 , codename: Llamas in Pajamas
    * Min threads: 0, max threads: 4
    * Listening on tcp://127.0.0.1:52270
      クラスを作成できること
      2300 クラスが存在する時
        クラスを編集できること
        クラスを削除できること
        クラスを表示できること

長くなったので今日はここまで