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を反映させる手段があるかもしれませんが、その場合は検索で見つけてください。 今回は以上になります。