Closed7
Rails - RSpecについて
modelテストとcontrollerテストの違い
modelテスト
モデルに記載されているビジネスロジックなどをテストします。
- バリデーションのテスト
- メソッドやスコープのテスト
- アソシエーションのテスト
controllerテスト
ユーザーのリクエストに対するコントローラーの挙動をテストします。
- レスポンスのステータスコード
- コントローラー内のアクションの結果をテスト
- インスタンスメソッドのテスト
- アクセス制御のテスト
ブラウザテスト
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ディレクトリ内に配置します。
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.rb
のRSpec.configure do |config|
内に記載することで、FactoryBot.create(:post)
とrspecテストコード内に記載しないといけないのを、post = create(:post)と記述できるようになります。
ログイン処理を別で定義して再利用できるようにする
- ログインモジュールを
support
ディレクトリ配下に配置する。 - 共通項目なので、rails_helper.rbに読み込みを設定する。
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テストで使用する。
- within
指定したdom内に絞ってテストを行うことができる。
let
とlet!
let(遅延評価)
- 最初に呼び出されたときに初めてブロック内のコードを実行します。
- 同じテスト内で複数呼び出された時、前回の結果がキャッシュされて再利用されます。
- テスト内でtagという変数を使用するまで、tagはデータベースに作成されません。
let!(即時関数)
- テスト実行前に実行されます。
- 確実にデータが必要な場合に使用する。
- テスト実行前にデータが作成される。
このスクラップは2023/11/10にクローズされました