Rspecでrails db:seedで使う予定のデータを直書きする

今日は結合テストを用いて、動画投稿機能について書いたので、記録していきます。

require 'rails_helper'

RSpec.describe "Posts", type: :system do
  it '動画を投稿することができる' do
    @user = FactoryBot.create(:user)
    @game = Game.create(:game_title => 'マリオカート')
    @grade = Grade.create(:grades => '初級')
    # 投稿ページへ移動する
    basic_pass root_path
    sign_in(@user)
    visit new_post_path

    # 投稿をする
    fill_in 'title', with: 'test'
    fill_in 'youtube-url', with: 'youtubeのURL'
    fill_in 'content', with: 'kaisetu'
    select @game.game_title, from: 'post[game]'
    select @grade.grades, from: 'post[grade]'
    expect{
      find('input[name="commit"]').click
    }.to change { Post.count }.by(1)
  end

  it '動画を削除することができる' do
    @user = FactoryBot.create(:user)
    @game = Game.create(:game_title => 'マリオカート')
    @grade = Grade.create(:grades => '初級')
    @post = Post.create(:title => 'test', :youtube_url => 'youtubeのURL', :content => 'test', :game_id => @game.id, :grade_id => @grade.id, :user_id => @user.id)

    basic_pass root_path
    sign_in(@user)
    visit post_path(@post.id)
    expect{
      click_link "削除"
    }.to change { Post.all.count }.by(-1)
  end

end

動画を投稿に必要な情報は、タイトル、youtubeのURL、解説文、ゲーム名、自己判断で決めていただいたゲームの実力(以降は階級)です。 ゲーム名、階級はあらかじめこちらで登録して扱うことにしています。

    @user = FactoryBot.create(:user)
    @game = Game.create(:game_title => 'マリオカート')
    @grade = Grade.create(:grades => '初級')

そのため、Rspecで書いていくと初めらデータがない状態になってるので、初めに作成する必要性があります。 今回は何個も登録する必要がないのでこのデータのみをあらかじめ作成します。

やっていて非常に難しかった部分はセレクトボックス部分です。 そもそも知識がなかったということもありますが、 何よりも参考にするべきQiitaの記事で個人的に理解できず、苦労しました。 結局のところ、Rspec公式ドキュメントによると、

select('Option', from: 'Select Box')

出典:Rspec公式ドキュメント https://github.com/teamcapybara/capybara#the-dsl

という様な形に書いていくそうです。

これだけだとかなりわかりずらいと感じるので、実際にやっているものがこちらです。

    select @game.game_title, from: 'post[game]'
    select @grade.grades, from: 'post[grade]'

こちらが今回使用したコードになりますが、

できる限りわかりやすく伝えようと試みると

    select 'マリオカート', from: 'post[game]' #ゲーム名のセレクトボックスのname属性
    select '初級', from: 'post[grade]'#階級のセレクトボックスのname属性

このようにすると少し伝わりやすくなったでしょうか? 実際の挙動だとマリオカートを初心者の方が投稿したということになります。 'post[game]'というのは、検証ツールを使用することで見ることができます。 あまり詳しくは書きませんがname=に続くのが今回だと'post[game]'です。 この記事で理解してほしいのは、seedで記入している情報はテストで反映されていないということ、 セレクトボックスには、selectを用いることです。 本当はRspecのテストにseedを反映させる手段があるかもしれませんが、その場合は検索で見つけてください。 今回は以上になります。