ひとつのexpectで複数のchangeを確認する方法

2022年6月19日 16:23
ユーザーに関するフィーチャーテストで、ユーザーを削除したらそのユーザーに関連するモデルも削除されることをテストしたいと思いました。

テスト方法

spec/features/users_spec.rb
require 'rails_helper'

RSpec.feature "Users", type: :feature do
  scenario 'user deletes a user' do
    user = FactoryBot.create(:user)
    user.funds << FactoryBot.build(:fund)
    user.ratios << FactoryBot.build(:ratio)
    user.save

    visit root_path
    click_link 'ログイン'
    fill_in 'メールアドレス', with: user.email
    fill_in 'パスワード', with: user.password
    click_button 'ログイン'

    expect{
      click_button '削除'
      page.driver.browser.switch_to.alert.accept

      expect(page).to have_content '投資信託管理サービス'
    }.to change(User, :count).by(-1).and change(Fund, :count).by(-1).and change(Ratio, :count).by(-1)
  end
end
削除ボタンをクリックすると確認ダイアログが表示されるので、Selenium Chromeというドライバーを使用しています。
下から3行目、ひとつのexpectに対してandでchangeを繋いでいき3つのモデルとも削除されているかというテストをしています。
$ rspec spec/features

Users
Capybara starting Puma...
* Version 3.12.1 , codename: Llamas in Pajamas
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:59581
  user deletes a user

Finished in 11.78 seconds (files took 6.52 seconds to load)
2 examples, 0 failures
テストを実行するとブラウザが立ち上がり自動でログインしてユーザー削除をテストしてくれます。

関連記事

【Rails】Capybaraのfill_inメソッドを実行すると「既存レコードの内容+指定した内容」がセットされる事象の原因と対処【RSpec】
# はじめに RSpec + Capybaraを使用して、Railsアプリの統合テストを実装しています。とあるモデルの編集画面において、入力フォームの内容を書き換えた上で送信し、レコードが更新されることを確認します。 入力フォームの内容を書 [...]
2022年1月27日 21:22
RSpecの勉強をはじめました
今日からRSpecの勉強をはじめました。教材はEveryday Rails - RSpecによるRailsテスト入門です。 RSpecについての教材ですが、ところどころテスト自動化における基本理念のような記述もあり、テスト自動化にあまり慣れていない [...]
2019年11月15日 10:49