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

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

    テスト方法

    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
    テストを実行するとブラウザが立ち上がり自動でログインしてユーザー削除をテストしてくれます。

    関連記事

    関連記事はありません。