Closed7

Rails - RSpecについて

Ippei ShimizuIppei Shimizu

modelテストとcontrollerテストの違い

modelテスト

モデルに記載されているビジネスロジックなどをテストします。

  • バリデーションのテスト
  • メソッドやスコープのテスト
  • アソシエーションのテスト

controllerテスト

ユーザーのリクエストに対するコントローラーの挙動をテストします。

  • レスポンスのステータスコード
  • コントローラー内のアクションの結果をテスト
  • インスタンスメソッドのテスト
  • アクセス制御のテスト
Ippei ShimizuIppei Shimizu

ブラウザテスト

capybara.rb
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium, using: :headless_chrome, screen_size: [1920, 1080]
  end
end

これは、capybaraとwebdriverを使用して、chromeをGUIなしのヘッドレスモードで起動して、システムテストを行うための設定です。supportディレクトリ内に配置します。

Ippei ShimizuIppei Shimizu

FactoryBotでテストデータを作成する

  • trait

factoriesディレクトリ中に置かれて、再利用されるであろうテストデータの属性をまとめるものです。rspec内のテストコードで、その属性を再利用することができます。

spec/factories/users.rb
Factory.define do
  factory :user do
    name {"ootani"}
    email {"ootani@example.com"}

    trait :adimin do
      admin {true}
    end
  end
end

# rspecテスト内で使用する
admin_user = create(:user, :admin)

管理者権限を持つという:adminを作成し、再利用できるようにしている。

  • confin.include FactoryBot::Syntax::Methods

rails_helper.rbRSpec.configure do |config|内に記載することで、FactoryBot.create(:post)とrspecテストコード内に記載しないといけないのを、post = create(:post)と記述できるようになります。

Ippei ShimizuIppei Shimizu

ログイン処理を別で定義して再利用できるようにする

  • ログインモジュールをsupportディレクトリ配下に配置する。
  • 共通項目なので、rails_helper.rbに読み込みを設定する。
Ippei ShimizuIppei Shimizu

rspecテストコードエラー

$ bundle exec rspec spec/controllers/admin/articles/previews_controller_spec.rb
F

Failures:

  1) Admin::Articles::PreviewsController ログイン後 画像のコンテンツブロック挿入後 画像のファイルをアップロードしていない場合 記事のプレビューを表示できる
     Failure/Error: visit admin_login_identifier_path

     NoMethodError:
       undefined method `visit' for #<RSpec::ExampleGroups::AdminArticlesPreviewsController::Nested::Nested::Nested:0x0000000105284bb8>
     # ./spec/support/login_macros.rb:3:in `login_as'
     # ./spec/controllers/admin/articles/previews_controller_spec.rb:9:in `block (5 levels) in <top (required)>'

Finished in 0.22422 seconds (files took 9.38 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/ad

NoMethodError: undefined method 'visit' → visitメソッドが見つかりません。
controller spec内では、visitメソッドは使えないみたい。

visitメソッドは、systemテストで使用する。

Ippei ShimizuIppei Shimizu

letlet!

let(遅延評価)

  • 最初に呼び出されたときに初めてブロック内のコードを実行します。
  • 同じテスト内で複数呼び出された時、前回の結果がキャッシュされて再利用されます。
  • テスト内でtagという変数を使用するまで、tagはデータベースに作成されません。

let!(即時関数)

  • テスト実行前に実行されます。
  • 確実にデータが必要な場合に使用する。
  • テスト実行前にデータが作成される。
このスクラップは6ヶ月前にクローズされました