こたつとみかんとプログラミング

33才実務未経験ですがウェブエンジニアにジョブチェンジするために勉強したことをアップするためのブログです。

RSpec導入方法まとめ

Railsチュートリアル、POTEPANサブ課題終わり、本課題に突入しているが、RSpecは一から学んでいる状態なので、導入方法を備忘録としてまとめておく。※ Everyday Rails- RSpecによるRailsテスト入門 から抜粋

1. gemのインストール

gemfileの開発環境とテスト環境にrspec-railsを追加し、bundle install

group :development, :test do
  gem 'rspec-rails'
end

2. RSpecの設定

rails generate でrspecをインストールする

$ rails g rspec:install
 => create .rspec
 => create spec
 => create spec/spec_helper.rb
 => create spec/rails_helper.rb

4つのファイル・ディレクトリが作成される。

  • .rspec RSpec 用の設定ファイル
  • spec 作成したスペックファイルを格納するディレクト
  • spec_helper.rb RSpecの設定カスタマイズ用のヘルパーファイル
  • rails_helper.rb RSpecを使用する際のRailsカスタマイズ用のヘルパーファイル

3. RSpec出力をドキュメント形式に変更

必須ではない。出力結果がわかりやすくなる。

.rspec
--require spec_helper
--format documentation

4. (開発効率化)

必須ではない。テストの起動速度が早くなる。

group :development do
  # 元から書かれている gem は省略 ...
  gem 'spring-commands-rspec'
end
$ bundle install
$ bundle exec spring binstub rspec
 #  => bin ディレクトリ内に rspec という名前の実行用ファイルが作成される

5. ジェネレータの設定

config/application.rb

require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module Projects
class Application < Rails::Application
config.load_defaults 5.1

# Rails が最初から書いているコメントは省略 ...

config.generators do |g|
  g.test_framework :rspec,
    fixtures: false,
    view_specs: false,
    helper_specs: false,
    routing_specs: false
    end
  end
end

テストファイルの作り方

$ rails g rspec:controller [Controller_name]
$ rails g rspec:model [Model_Name]

FactoryBotの使い方

fixtureのようにユーザーの属性値を前もって設定できる。
Gemfile

group :development, :test do
  gem "rspec-rails", "~> 3.6.0"
  gem "factory_bot_rails", "~> 4.10.0"
  # このグループの他の gem が並ぶ ...
end

ファクトリを作成する際のコマンド

$ bin/rails g factory_bot:model user

フィーチャースペックの導入方法

※追記:Docker上で動かすための設定は以下記事を参照
Docker 環境に Entrykit と ChromeDriver を導入する - こたつとみかんとプログラミング

1. 必要なgemの追加(capybaraは5.1以降標準搭載されているので必要なし)

Gemfile

group :test do
  gem 'capybara'
  gem 'webdrivers'
  gem 'launchy'
end

Webdrivers テストをchromeで行うために必要なgem(詳細は後述)
Launchy save_and_open_page をスペック内で呼びだしたときに、Launchy が保存された HTML を自動的に開いてくれるgem。

2. RSpec が Capybara を読み込むように設定

spec/rails_helper.rb

# This file is copied to spec/ when you run 'rails generate
# rspec:install'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if \
Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded
# until this point!
require 'capybara/rspec'
# RSpec の設定が続く ...

3. supportディレクトリの有効化

spe/rails_helper.rbでrailsをカスタマイズしたいが、rails_helper.rbをきれいに保っておきたい場合、以下の設定のコメントを外して有効化することで、 support ディレクトリが使用できるようになり、以下ディレクトリに新規ファイルを作ることで、独立したファイルに新しい設定を書くことができる。
spec/rails_helper.rb

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

4. chrome でテストできるように設定する

デフォルトでは Capybara は selenium-webdriver に対して Firefox を使ってテストを実行するように伝えるが、最近登場した新しいバージョンの Firefox では互換性問題が報告されているらしい。かわりに Chrome を使うように設定する。
supportディレクトリに新規ファイルを作成
spec/support/capybara.rb

Capybara.javascript_driver = :selenium_chrome

以下、参考にしたいサイト
https://devhints.io/capybara
https://qiita.com/jnchito/items/607f956263c38a5fec24