プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

12/17 今日学んだこと(RSpec復習)

本日からは既存のアプリのエラーをRSpecを書きながら修正していきますので、学んだことを記録していこうと思います。



RSpec

権限の扱い

管理者権限を持つユーザーをFactoryBotで作るときは、無闇にadmin属性を持つユーザーが作られないようにtraitを使うと良い。
デフォルトで作られるユーザーは、一般属性にするべし。

FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "user_#{n}" }
    password { "password" }
    password_confirmation { "password" }
    role { :writer }
    
    trait :admin do
      sequence(:name) { |n| "admin-#{n}" }
      role { :admin }
    end
    trait :editor do
      sequence(:name) { |n| "editor_#{n}" }
      role { :editor }
    end
    trait :writer do
      sequence(:name) { |n| "writer_#{n}" }
      role { :writer }
    end
  end
end



わかりやすく書く

システムスペックファイルの名前は、何のテストか一目でわかるものにする。また、テストコードのdescribeやcontextも具体的に記載する。 また、テストするユーザーの権限に合わせて、letで定義するオブジェクトの名前も変えると良い。

最初のコード

#articles_spec.rb

RSpec.describe "Articles", type: :system do
  describe 'ログイン後' do
    describe '管理者でログイン' do
      let(:user){ FactoryBot.create(:user) }
      before { login_as(user) }
        context '画像が未選択' do
          fit 'プレビューが正しく表示される' do
            visit new_admin_article_path
            fill_in 'タイトル', with: 'title'
            fill_in 'スラッグ', with: 'slag'
            fill_in '概要', with: 'body'
            click_on '登録する'
            click_on 'ブロックを追加する'
            click_on '画像'
            click_on 'プレビュー'
            expect(page).to have_content 'Blog'
            expect(page).to have_content 'title'
          end
        end
    end
  end
end

ファイル名も曖昧だしコードもごちゃごちゃで何をテストしたいかわかりづらい。

理想コード

#admin_articles_previews_spec/rb

RSpec.describe "AdminArticlesPreviews", type: :system do
  let(:admin){ create :user, :admin }
  describe '記事作成画面で画像ブロックを追加' do
    context '画像を選択せずにプレビューを閲覧' do
      fit 'プレビューが正常に表示される' do
        login_as(admin)
        visit new_admin_article_path
        fill_in 'タイトル', with: 'title'
        fill_in 'スラッグ', with: 'slag'
        fill_in '概要', with: 'body'
        click_on '登録する'
        click_on 'ブロックを追加する'
        click_on '画像'
        click_on 'プレビュー'
        expect(page).to have_content 'Blog'
        expect(page).to have_content 'title'
      end
    end
  end
end



エラー集

LoginMacrosが動かない。うまくfill_inできない。

初期データが投入されていないのでそもそもページができていない。 テスト環境にシードデータを入れることで解決

 config.before :suite do
    SeedFu.seed
  end

こうすることでspecを走らせるたびにシードデータが投入されるようになる。