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?

7 Railsアプリケーションのテスト

雑感

この章はminitestを使用したRailsのテスト手法について内容でした。minitestは実際の業務では触れなさそうなので、factory_botOmniAuthのモック化などrspecと共通化できる内容のみにメモはとどめています。

7.3 テストデータを作成する

factory_botの導入

  1. gemを追加してbundle install

テストファイルだけでなくコンソールでも実行したい場合はgroup :development, :test do内にgemを追加する

group :development, :test do
+  gem 'factory_bot_rails' # テストデータ作成用のライブラリ
end
  1. test/test_helper.rbfixtures :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の実行
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?