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

RailsApp Rails RSpec Capybara 2018年 12月 3日

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

Gemfile の設定

  1. Gemfile に capybara, selenium-webdriver, chromedriver-helper を追加する.
  2. group :development, :test do
      # Capybara system testingとselenium driverのサポートを追加
      gem 'capybara'
      gem 'selenium-webdriver'
      # Chromeでのシステムテスト実行に使うchromedriverを簡易インストール
      gem 'chromedriver-helper'
      (中略)
    end
  3. chromedriver を homebrew でインストールしておく(Techracho の記事では brew install chromedriver となっているが,その後 cask に移動したらしい).
  4. brew cask install chromedriver
  5. bundle してインストールする(2行目以降は結果).
  6. 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
  7. system_spec の場合に,selenium_chrome_headless を常に利用するように spec/spec_helper.rb に設定を追加する.
  8. RSpec.configure do |config|
      config.before(:each, type: :system) do
        driven_by :selenium_chrome_headless
      end
      (後略)
    end

クラスに関連するテスト

  1. まず,system spec を保存するフォルダを作成する.
  2. mkdir -p spec/system
  3. クラスの作成,編集,削除,表示についてテストを行う.以下のようなイベントが処理できる.
    • visit path: path に飛ぶ.
    • click_on 'リンク名': リンク名をクリックする.
    • page.driver.browser.switch_to.alert.accept: アラート画面の accept をクリックする.
    • expect(page).to have_content '文字列': 文字列が画面に書かれていることを確認する.
    • expect(page).not_to have_content '文字列': 文字列が画面に書かれていないことを確認する.
  4. 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
  5. この状態だと guard が止まってしまった.guard を止めて,bin/rspec を実行するとやはり止まってしまう.
  6. spring と相性が悪いのかもしれないので,Guardfile の bin/spring を bundle exec rspec に変更した.
  7. guard :rspec, cmd: "bundle exec rspec" do
  8. この結果,以下のような system spec の結果になった.puma が起動し,Capybara でテストが実行されていることがわかる.
  9. 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 クラスが存在する時
        クラスを編集できること
        クラスを削除できること
        クラスを表示できること

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