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を走らせるたびにシードデータが投入されるようになる。