7 Railsアプリケーションのテスト
雑感
この章はminitest
を使用したRailsのテスト手法について内容でした。minitest
は実際の業務では触れなさそうなので、factory_bot
やOmniAuth
のモック化などrspec
と共通化できる内容のみにメモはとどめています。
7.3 テストデータを作成する
factory_botの導入
- gemを追加して
bundle install
テストファイルだけでなくコンソールでも実行したい場合はgroup :development, :test do
内にgemを追加する
group :development, :test do
+ gem 'factory_bot_rails' # テストデータ作成用のライブラリ
end
-
test/test_helper.rb
のfixtures :all
の設定を削除
factory_botの作成
テストデータ用ファイルの作成コマンド
% bin/rails g factory:model user
テストデータファイルの書き方
test/factories/users.rb
FactoryBot.define do
# 第一引数 :user が呼び出す時の名称
# aliases: [:owner]で別名を設定
factory :user, aliases: [:owner] do
provider { "github" } # attribute名 { "設定する値" }で値を設定
sequence(:uid) { |i| "uid_#{i}" } # sequenceメソッドで連番を生成
sequence(:name) { |i| "name_#{i}" }
sequence(:image_url) { |i| "http://example.com/image_#{i}.jpg" }
end
end
テストデータへ関連を定義
test/factories/events.rb
FactoryBot.define do
factory :event do
owner # 作成時にUserが合わせて作成され、owner_idとして設定される
sequence(:name) { |i| "イベント名#{i}" }
sequence(:place) { |i| "イベント開催場所#{i}" }
sequence(:content) { |i| "イベント本文#{i}" }
start_at { rand(1..30).days.from_now }
end_at { start_at + rand(1..30).hours }
end
end
テストデータ作成コマンド
railsコンソールを起動して実行
> FactoryBot.create(:event)
乱数を同じにしてテストを実行したい場合
問題を再現させるために乱数を一定にしたい場合は、--seed
オプションを使用する
% bin/rail test test/models/event_test.rb --seed 33540
7.4 システムテスト
OmniAuthをモック化したログインヘルパーの作成
test/sign_in_helper.rb
module SignInHelper
def sign_in_as(user)
OmniAuth.config.test_mode = true # テストモードを有効にする
# OmniAuthをモック化し、GitHub認証を実行すると引数で設定したレスポンスを返却するようになる
OmniAuth.config.add_mock(
user.provider,
uid: user.uid,
info: { nickname: user.name,
image: user.image_url })
case
# システムテスト用の動作
when respond_to?(:visit)
visit root_url
click_on "GitHubでログイン"
# コントローラテスト用の動作
when respond_to?(:get)
get "/auth/github/callback"
else
raise NotImplementedError.new
end
@current_user = user
end
def current_user
@current_user
end
end
作成後、rails_helper
もしくはspec_helper
に下記設定を追加する
- 下記はrspecの場合の例
- Rails特有の機能(ログイン、データベース操作等)に関連するヘルパーなので下記の場合は
rails_helper
へ追加 - 純粋なRSpec全般の設定やRailsに依存しないヘルパーの場合は
spec_helper
へ追加
spec/rails_helper.rb
require 'support/sign_in_helper'
RSpec.configure do |config|
# 各テストタイプでのみ使用する場合
config.include SignInHelper, type: :system
config.include SignInHelper, type: :request
config.include SignInHelper, type: :controller
# または全てのタイプで使用する場合
config.include SignInHelper
end
各rspecごとにアプリの中で実際に実行される箇所が異なる
- コントローラスペック
- コントローラのみ
- リクエストスペック
- コントローラ
- ビュー
- rack middleware
- システムスペック
- ルーティング
- コントローラ
- ビュー
- rack middleware
- JavaScriptの実行